【问题标题】:How do I skip certain ValidateInterceptor?如何跳过某些 ValidateInterceptor?
【发布时间】:2017-07-20 01:28:23
【问题描述】:

我创建了一个VariantValueCategory 并想跳过ValidateInterceptor,因为它不允许我通过ImpexHMC 创建VariantValueCategory。谁能建议我如何跳过ValidateInterceptor 或任何Interceptor

【问题讨论】:

    标签: hybris impex


    【解决方案1】:

    其实Hybris中ImpEx导入数据有两种模式

    • 主动模式:它使用ServiceLayer 进行导入。这意味着像INSERTUPDATEREMOVE 这样的操作是使用ModelService 执行的,因此像interceptorsvalidators 这样的ServiceLayer 基础架构会被触发。
    • 传统模式:这是一个非常快速的CRUDE 导入,这意味着它绕过了Hybris 的ServiceLayer,因此不会调用interceptorsvalidators

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

    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>
    

    【讨论】:

    • impex.legacy.mode 的方式是激进的,它绕过所有拦截器。你不能精确,只是跳过一个特定的验证器。现在有更简洁的方法来禁用拦截器。请检查我的答案!
    【解决方案2】:

    回答 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

    【讨论】:

    • 太棒了,我不知道可以从 impex 禁用特定的拦截器。
    • @MouadELFakir 是的,我想它很新。我在开发 5.4 时没有听说过它。实际上,您的答案适用于 6 之前的版本,因为上面的代码可能不起作用。
    【解决方案3】:

    最简单的方法:unregisterInterceptor

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

    def inteceptorMapping = spring.getBean("yourInterceptorMappingBeanId")
    registry = spring.getBean("interceptorRegistry");
    registry.unregisterInterceptor(inteceptorMapping);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2012-06-22
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多