自定义产品限制在子组件ExampleComponent上不生效问题排查
因项目特定可见性规则,我创建了自定义产品限制ExampleAvailabilityRestriction,可应用于ExampleListComponent、ExampleComponent及首页、商品页等页面。ExampleListComponent可包含多个ExampleComponent实例,将该限制应用于直接添加在首页内容槽的ExampleListComponent时正常生效,但应用于子组件ExampleComponent时失效。
相关代码片段如下:
items.xml
<collectiontype code="ExampleCardList" elementtype="ExampleComponent" autocreate="true" generate="true" type="list" /> <itemtype code="ExampleComponent" extends="AbstractMediaContainerComponent" autocreate="true" generate="true" jaloclass="com.example.core.jalo.ExampleComponent"> <attributes> <attribute qualifier="title" type="localized:java.lang.String"> <persistence type="property" /> </attribute> <attribute qualifier="secondaryMedia" type="Media"> <modifiers read="true" write="true" search="true" unique="false" /> <persistence type="property" /> </attribute> </attributes> </itemtype> <itemtype code="ExampleListComponent" extends="SimpleCMSComponent" autocreate="true" generate="true" jaloclass="com.example.core.jalo.ExampleListComponent"> <attributes> <attribute qualifier="cards" type="ExampleCardList"> <persistence type="property" /> </attribute> </attributes> </itemtype> <itemtype code="ExampleAvailabilityRestriction" jaloclass="com.example.core.jalo.restrictions.ExampleAvailabilityRestriction" extends="AbstractRestriction" autocreate="true" generate="true"> <attributes> <attribute qualifier="product" type="ProductList"> <persistence type="property" /> </attribute> </attributes> </itemtype>
ExampleAvailabilityRestrictionEvaluator.java
public class ExampleAvailabilityRestriction implements CMSRestrictionEvaluator<ExampleAvailabilityRestrictionModel> { public boolean evaluate(ExampleAvailabilityRestrictionModel restrictionModel, RestrictionData restrictionData) { List<ProductModel> products = restrictionModel.getProduct(); if (CollectionUtils.isEmpty(products)) { return true; } for (ProductModel product : products) { if (!availabilityService.isProductAvailable(product.getCode())) { return false; } } return true; } }
我已验证其他开箱即用(OTB)限制,代码无明显问题,请问还需哪些配置才能让该限制在子组件上生效?
针对子组件限制失效的问题,可从以下几个方向排查配置:
确保限制评估器正确注册
在Spring配置文件(如core-spring.xml)中,将自定义限制评估器注册为CMSRestrictionEvaluator类型的Bean,并通过别名关联到对应的限制模型:<bean id="exampleAvailabilityRestrictionEvaluator" class="com.example.core.restrictions.ExampleAvailabilityRestrictionEvaluator"> <property name="availabilityService" ref="availabilityService"/> </bean> <alias name="exampleAvailabilityRestrictionEvaluator" alias="CMSRestrictionEvaluator.ExampleAvailabilityRestriction"/>这一步是让Hybris框架识别并调用你的自定义评估逻辑。
子组件渲染时启用限制评估
父组件ExampleListComponent渲染子组件ExampleComponent时,必须使用Hybris提供的CMS渲染机制,而非手动循环渲染。比如在JSP视图中使用<cms:component>标签,并开启限制评估:<c:forEach items="${component.cards}" var="card"> <cms:component component="${card}" evaluateRestrictions="true"/> </c:forEach>如果是Thymeleaf模板,使用对应的CMS组件处理器:
<div th:each="card : ${component.cards}"> <div th:replace="cms/component :: component(component=${card}, evaluateRestrictions=true)"></div> </div>手动渲染子组件会跳过框架的限制评估流程,导致子组件上的限制不生效。
检查RestrictionData上下文传递
确保在评估子组件限制时,RestrictionData包含完整的上下文信息(如当前用户、会话、站点等)。如果父组件渲染时自定义了RestrictionData,需要将其完整传递给子组件的评估逻辑,避免因上下文缺失导致评估结果异常。确认组件类型支持限制关联
虽然ExampleComponent继承自AbstractMediaContainerComponent(间接继承CMSComponent),而CMSComponent本身已关联restrictions集合,但仍需确认items.xml中未覆盖或移除该关联。如果有自定义修改,需确保ExampleComponent保留restrictions属性的继承或显式定义。
内容的提问来源于stack exchange,提问作者Manohar Ch

