AEM6.5:如何从HTL/Sightly模板向资源传递参数
解决AEM中向嵌套资源传递参数及获取Selectors的问题
一、解决contentHub始终为null的问题
你当前通过requestAttributes传递参数未生效,可从以下方向排查优化:
1. 确认父组件参数的正确性
先检查父组件Model中的model.config是否明确包含contentHub键值对,示例如下:
@Model(adaptables = SlingHttpServletRequest.class) public class ParentComponentModel { private Map<String, Object> config; @PostConstruct protected void init() { config = new HashMap<>(); config.put("contentHub", "your-target-value"); // 确保此处正确赋值 } public Map<String, Object> getConfig() { return config; } }
2. 换用bindings传递参数(更可靠)
requestAttributes依赖请求作用域,易因资源加载上下文导致参数丢失,推荐用bindings直接注入子资源的绑定上下文:
修改HTL代码:
<sly data-sly-test="${teasers.eventTeaser}" data-sly-resource="${teasers.resource @ resourceType='xxx/components/content/eventTeaser', bindings= {'contentHub': model.config.contentHub}, selectors='blabla'}"></sly>
在eventTeaser的Sling Model中用@BindingValue接收参数:
@Model(adaptables = SlingHttpServletRequest.class) public class EventTeaserModel { @Inject @BindingValue(name = "contentHub") private String contentHub; public String getContentHub() { return contentHub; } }
3. 修正@RequestAttribute配置(若坚持使用)
若仍想用requestAttributes,需确保Model适配SlingHttpServletRequest,并调整注解配置:
@Model(adaptables = SlingHttpServletRequest.class) public class EventTeaserModel { @RequestAttribute(name = "contentHub", required = false) // 设为非必填避免初始化报错 private String contentHub; public String getContentHub() { return contentHub; } }
二、在eventTeaser模板中获取Selectors的值
1. HTL模板直接获取
通过request.requestPathInfo对象直接读取selectors:
<!-- eventTeaser的HTL模板 --> <div class="event-teaser ${request.requestPathInfo.selectors[0] ? 'teaser--' + request.requestPathInfo.selectors[0] : ''}"> <!-- 组件内容 --> </div>
${request.requestPathInfo.selectors}:返回包含所有selectors的字符串数组${request.requestPathInfo.selectorsString}:返回逗号分隔的selectors字符串
2. Sling Model中处理后传递到模板
若需在Java逻辑中处理selectors,可使用@RequestPathInfo注解:
@Model(adaptables = SlingHttpServletRequest.class) public class EventTeaserModel { @RequestPathInfo private RequestPathInfo requestPathInfo; public String getCurrentSelector() { if (requestPathInfo.getSelectors() != null && requestPathInfo.getSelectors().length > 0) { return requestPathInfo.getSelectors()[0]; } return ""; } }
在HTL中调用:
<div class="event-teaser teaser--${model.currentSelector}"> <!-- 组件内容 --> </div>
内容的提问来源于stack exchange,提问作者scura s
相关产品推荐
相关产品推荐

