如何跳过某些 ValidateInterceptor?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

    或者直接把配置设置成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);

【讨论】:

以上是关于如何跳过某些 ValidateInterceptor?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示使用 py.test 时跳过某些测试的原因?

如何告诉 py.test 跳过某些目录?

使用scrapy爬行时如何跳过某些文件类型?

pytest如何跳过参数化excel里面某些条件的数据

如何跳过 Wordpress 中相邻帖子上的某些链接?

如何让maven跳过某些指定的Test用例?