Adobe Experience Manager中获取嵌套页面jcr:content属性异常排查
AEM嵌套页面jcr:content属性获取返回null问题
我在Adobe Experience Manager中开发,有个名为News的父页面,下面包含多个嵌套页面。尝试获取所有嵌套页面的jcr:content节点属性时,响应返回null。
CRXDE页面截图

我的代码
NewsServiceImpl
@Component(service = NewsService.class) public class NewsServiceImpl implements NewsService { @Reference private QueryBuilder queryBuilder; @Override public Optional<Iterator<Resource>> getNews(SlingHttpServletRequest request, String searchPath) { Iterator<Resource> resourceIterator = null; Session session = request.getResourceResolver().adaptTo(Session.class); final Map<String, String> map = new HashMap<>(); map.put("path", searchPath); map.put("1_property", "sling:resourceType"); map.put("1_property.value", "xxx/components/page"); Query query = queryBuilder.createQuery(PredicateGroup.create(map), session); SearchResult result = query.getResult(); resourceIterator = result.getResources(); return Optional.ofNullable(resourceIterator); } }
Servlet
@Component(service = Servlet.class, property = { Constants.SERVICE_DESCRIPTION + "= Get All News", SLING_SERVLET_METHODS + "=GET", SLING_SERVLET_PATHS + "=/bin/news" }) public class NewsServlet extends SlingSafeMethodsServlet { @Reference transient NewsService newsService; protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json;charset=utf-8"); JsonArray resultArray = new JsonArray(); Optional<Iterator<Resource>> isNews = newsService.getNews(request, request.getParameter("searchPath")); if (isNews.isPresent()) { Iterator<Resource> news = isNews.get(); while (news.hasNext()) { Resource parentPageResource = news.next(); // 检查jcr:content是否存在,将响应存入resultArray if (parentPageResource.getChild("jcr:content") != null) { resultArray.add(parentPageResource.getChild("jcr:content").getValueMap().toString()); } } } response.getWriter().print(resultArray); } }
可能的原因及解决方法
查询范围与参数匹配问题
- 确认
searchPath参数是否传递了News父页面的完整路径(比如/content/xxx/news),可在Servlet中打印参数值排查。 - 检查
xxx/components/page是否是嵌套页面实际的sling:resourceType,需从CRXDE中确认目标页面jcr:content节点的该属性值。 - 添加
path.flatten=true参数开启递归查询,确保能获取所有层级的嵌套页面:map.put("path.flatten", "true");
- 确认
权限与资源获取方式问题
- 测试用admin用户请求Servlet,排查是否是Session权限不足导致无法访问jcr:content节点。
- 替换
getChild("jcr:content")的调用方式,改用资源解析器直接获取:Resource contentResource = request.getResourceResolver().getResource(parentPageResource.getPath() + "/jcr:content");
JSON输出与空指针优化
- 避免直接使用
getValueMap().toString()输出非标准JSON,逐个提取属性构建规范JSON对象:ValueMap contentMap = contentResource.getValueMap(); JsonObject jsonObj = new JsonObject(); jsonObj.addProperty("pageTitle", contentMap.get("jcr:title", String.class)); // 按需添加其他属性 resultArray.add(jsonObj); - 缓存jcr:content资源对象,避免重复调用可能引发的空指针:
Resource contentResource = parentPageResource.getChild("jcr:content"); if (contentResource != null) { // 处理逻辑 }
- 避免直接使用
内容的提问来源于stack exchange,提问作者Faheem azaz Bhanej
相关产品推荐
相关产品推荐

