6

我创建了一个VariantValueCategory并想跳过它,ValidateInterceptor因为它不允许我创建VariantValueCategorybyImpex或 by HMC。任何人都可以建议我如何跳过 ValidateInterceptor或任何Interceptor

4

3 回答 3

15

hybris >= v6 的答案

检查 Mouad El Fakir 对以前版本的回答

您可以通过代码和 Impex 禁用拦截器。

使用代码

您可以使用运行保存模型代码,sessionService.executeInLocalViewWithParams并且可以使用参数来避免使用拦截器。

有 3 种类型的策略:

  • InterceptorExecutionPolicy.DISABLED_INTERCEPTOR_BEANS: 禁用 bean 列表
  • InterceptorExecutionPolicy.DISABLED_INTERCEPTOR_TYPES:禁用一种拦截器 - 例如验证器
  • InterceptorExecutionPolicy.DISABLED_UNIQUE_ATTRIBUTE_VALIDATOR_FOR_ITEM_TYPES:禁用UniqueAttributesValidator一组类型

示例 1 - 禁用 bean

final Map<String, Object> params = ImmutableMap.of(InterceptorExecutionPolicy.DISABLED_INTERCEPTOR_BEANS, ImmutableSet.of("yourDataInterceptorToDisable"));

sessionService.executeInLocalViewWithParams(params, new SessionExecutionBody()
{
    @Override
    public void executeWithoutResult()
    {
        //Do your stuff  
        modelService.save(something);   // save successful - yourDataInterceptor interceptor is disabled
    }
});

示例 2 - 禁用拦截器类型

final Map<String, Object> params = ImmutableMap.of(InterceptorExecutionPolicy.DISABLED_INTERCEPTOR_TYPES,
                ImmutableSet.of(InterceptorExecutionPolicy.DisabledType.VALIDATE));
sessionService.executeInLocalViewWithParams(params, new SessionExecutionBody()
{
    @Override
    public void executeWithoutResult()
    {
        //Do your stuff  
        modelService.save(something);    // save successful - all validate interceptors are disabled
    }
});

示例 3 - 按类型禁用

final Map<String, Object> params = ImmutableMap.of(InterceptorExecutionPolicy.DISABLED_UNIQUE_ATTRIBUTE_VALIDATOR_FOR_ITEM_TYPES, ImmutableSet.of("YourType"));

sessionService.executeInLocalViewWithParams(params, new SessionExecutionBody()
{
    @Override
    public void executeWithoutResult()
    {
        //Do your stuff  
        modelService.save(something);   // save successful - UniqueAttributesValidator not called
    }
});

使用 Impex

与 impex 相同,您可以添加 3 个参数来实现与代码相同的目的

示例 1 - 禁用 bean [disable.interceptor.beans='yourDataInterceptorToDisable']

INSERT_UPDATE YourType[disable.interceptor.beans='yourDataInterceptorToDisable'];isocode[unique=true];toto;titi;
;something;toto;titi;

示例 2 - 禁用拦截器类型 [disable.interceptor.types=validate]

INSERT_UPDATE YourType[disable.interceptor.types=validate];isocode[unique=true];toto;titi;
;something;toto;titi;

示例 3 - 按类型禁用 [disable.UniqueAttributesValidator.for.types='YourType']

INSERT_UPDATE YourType[disable.UniqueAttributesValidator.for.types='YourType'];isocode[unique=true];toto;titi;
;something;toto;titi;

参考:https ://help.hybris.com/6.3.0/hcd/9ce1b60e12714a7dba6ea7e66b4f7acd.html

于 2017-03-01T09:52:49.463 回答
10

实际上,在 Hybris 中使用ImpEx导入数据有两种模式:

  • 活动模式:它使用ServiceLayerto 进行导入。这意味着像 和 之类的动作INSERT是使用 来执行的,因此基础结构像UPDATE和被触发。REMOVEModelServiceServiceLayerinterceptorsvalidators
  • 传统模式:这是一个非常快速的CRUDE导入,这意味着它绕过了ServiceLayerHybris,因此调用了 nointerceptors和 no 。validators

那么如何启用传统模式呢?你可以通过三种不同的方式做到这一点:

  1. local.properties设置impex.legacy.mode = true并重新启动服务器。
<!-- local.properties -->

impex.legacy.mode = true
  1. 或者,如果您使用 导入HAC,请legacy mode选中复选框:

在此处输入图像描述

  1. 或者直接将配置设置成impex这样:
INSERT_UPDATE VariantValueCategory[impex.legacy.mode=true] ;myAttribute
...

但是,如果您想完全禁用interceptor被调用(不仅仅是为 impexes),您可以将其替换为VoidInterceptor.

VoidInterceptor :它是一个空的拦截器,它什么都不做。

所以如果我们假设你想阻止这个拦截器variantCategoryValidateInterceptor被调用,你可以像这样替换它:

<!-- in my*-spring.xml -->

<bean id="variantValueCategoryVoidInterceptorMapping" class="de.hybris.platform.servicelayer.interceptor.impl.InterceptorMapping">

    <property name="interceptor" ref="VoidInterceptor"/>

    <property name="typeCode" value="VariantValueCategory"/>

    <property name="replacedInterceptors" ref="variantCategoryValidateInterceptor"/>

</bean>
于 2017-02-28T23:04:22.467 回答
0

最简单的方法:unregisterInterceptor

转到 HAC -> 脚本语言 -> Groovy

def inteceptorMapping = spring.getBean("yourInterceptorMappingBeanId")
registry = spring.getBean("interceptorRegistry");
registry.unregisterInterceptor(inteceptorMapping);
于 2020-07-08T12:45:54.667 回答