AEM中conf目录下组件的Servlet实现方案咨询
解决AEM中模板结构组件Servlet 404问题的方案
方案1:发布模板结构组件到发布环境
模板结构里的someTeaser组件位于/conf路径下,默认可能未同步到发布实例:
- 检查复制代理的路径规则,确保
/conf/xx/settings/wcm/templates/someTemplate/structure被包含在复制范围内。 - 在作者实例中选中该结构节点执行发布操作,确保发布实例中存在该节点。
- 完成后访问组件的token接口,Servlet即可通过resourceType匹配到该资源。
方案2:直接绑定Servlet到页面组件路径
放弃resourceType匹配,改用路径匹配的方式绑定Servlet:
@SlingServletPaths( value = {"/content/*/jcr:content/root/main/container/someTeaser.token.json"} )
这种方式直接指向页面渲染时组件的路径,无需依赖/conf下的节点,但要注意如果模板结构的组件路径变动,Servlet的路径配置需同步修改。
方案3:绑定到PAGE类型但做组件存在性校验
若必须使用PAGE的resourceType,在Servlet逻辑中添加过滤,只处理包含目标组件的页面:
@Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { Resource pageResource = request.getResource(); // 查找页面结构中的目标组件 Resource teaserResource = pageResource.getChild("jcr:content/root/main/container/someTeaser"); if (teaserResource == null || !Constants.ResourceTypes.SOME_TEASER.equals(teaserResource.getResourceType())) { response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } // 此处编写令牌生成逻辑 // ... }
这样只有包含someTeaser组件的页面才会响应token请求,不会影响其他页面。
方案4:在组件模板中转发请求到Servlet
在someTeaser的HTL模板里用<sling:include>调用Servlet,确保请求上下文是页面中的组件实例:
<sling:include resource="${resource}" selector="token" extension="json" />
同时保留原Servlet的@SlingServletResourceTypes注解配置,页面渲染时会自动触发Servlet逻辑,无需直接访问组件URL。
内容的提问来源于stack exchange,提问作者scura s
相关产品推荐
相关产品推荐

