我创建了一个VariantValueCategory
并想跳过它,ValidateInterceptor
因为它不允许我创建VariantValueCategory
byImpex
或 by HMC
。任何人都可以建议我如何跳过 ValidateInterceptor
或任何Interceptor
?
3 回答
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
实际上,在 Hybris 中使用ImpEx导入数据有两种模式:
- 活动模式:它使用
ServiceLayer
to 进行导入。这意味着像 和 之类的动作INSERT
是使用 来执行的,因此基础结构像UPDATE
和被触发。REMOVE
ModelService
ServiceLayer
interceptors
validators
- 传统模式:这是一个非常快速的
CRUDE
导入,这意味着它绕过了ServiceLayer
Hybris,因此调用了 nointerceptors
和 no 。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>
最简单的方法:unregisterInterceptor
转到 HAC -> 脚本语言 -> Groovy
def inteceptorMapping = spring.getBean("yourInterceptorMappingBeanId")
registry = spring.getBean("interceptorRegistry");
registry.unregisterInterceptor(inteceptorMapping);