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

Adobe Experience Manager中获取嵌套页面jcr:content属性异常排查

AEM嵌套页面jcr:content属性获取返回null问题

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

CRXDE页面截图

CRXDE页面截图,展示News父页面下的嵌套页面及jcr:content节点

我的代码

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);
    }
}

可能的原因及解决方法

  • 查询范围与参数匹配问题

    1. 确认searchPath参数是否传递了News父页面的完整路径(比如/content/xxx/news),可在Servlet中打印参数值排查。
    2. 检查xxx/components/page是否是嵌套页面实际的sling:resourceType,需从CRXDE中确认目标页面jcr:content节点的该属性值。
    3. 添加path.flatten=true参数开启递归查询,确保能获取所有层级的嵌套页面:
      map.put("path.flatten", "true");
      
  • 权限与资源获取方式问题

    1. 测试用admin用户请求Servlet,排查是否是Session权限不足导致无法访问jcr:content节点。
    2. 替换getChild("jcr:content")的调用方式,改用资源解析器直接获取:
      Resource contentResource = request.getResourceResolver().getResource(parentPageResource.getPath() + "/jcr:content");
      
  • JSON输出与空指针优化

    1. 避免直接使用getValueMap().toString()输出非标准JSON,逐个提取属性构建规范JSON对象:
      ValueMap contentMap = contentResource.getValueMap();
      JsonObject jsonObj = new JsonObject();
      jsonObj.addProperty("pageTitle", contentMap.get("jcr:title", String.class));
      // 按需添加其他属性
      resultArray.add(jsonObj);
      
    2. 缓存jcr:content资源对象,避免重复调用可能引发的空指针:
      Resource contentResource = parentPageResource.getChild("jcr:content");
      if (contentResource != null) {
          // 处理逻辑
      }
      

内容的提问来源于stack exchange,提问作者Faheem azaz Bhanej

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:07:41