如何跳过某些 ValidateInterceptor?
Posted
技术标签:
【中文标题】如何跳过某些 ValidateInterceptor?【英文标题】:How do I skip certain ValidateInterceptor? 【发布时间】:2017-07-20 01:28:23 【问题描述】:我创建了一个VariantValueCategory
并想跳过ValidateInterceptor
,因为它不允许我通过Impex
或HMC
创建VariantValueCategory
。谁能建议我如何跳过ValidateInterceptor
或任何Interceptor
?
【问题讨论】:
【参考方案1】:其实Hybris中ImpEx导入数据有两种模式:
主动模式:它使用ServiceLayer
进行导入。这意味着像INSERT
、UPDATE
和REMOVE
这样的操作是使用ModelService
执行的,因此像interceptors
和validators
这样的ServiceLayer
基础架构会被触发。
传统模式:这是一个非常快速的CRUDE
导入,这意味着它绕过了Hybris 的ServiceLayer
,因此不会调用interceptors
和validators
。
那么如何启用传统模式?你可以通过三种不同的方式做到这一点:
-
在
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?的主要内容,如果未能解决你的问题,请参考以下文章