You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:35:32