如何在页面级获取Experience Fragment组件的JSON格式数据
解决AEM页面级导出Experience Fragment(XF)组件JSON数据的方案
默认的AEM Page Model Exporter(访问/model.json时的处理逻辑)不会自动解析并导出Experience Fragment组件内部的内容——因为XF本质是对另一个页面内容的引用,默认导出逻辑仅遍历当前页面的直接组件,不会递归处理XF的嵌套内容。以下是具体解决步骤:
1. 自定义Page Model Exporter扩展
创建自定义PageModelExporter实现,覆盖默认组件遍历逻辑,识别XF组件并解析其内部内容:
@Component(service = PageModelExporter.class, property = { "service.ranking:Integer=100" // 确保优先级高于默认实现 }) public class XFIncludingPageModelExporter extends PageModelExporterImpl { @Reference private ExperienceFragmentService experienceFragmentService; @Override protected void populateComponents(PageContext pageContext, JsonObject model, Page page, boolean exportAll, String[] components) throws RepositoryException { super.populateComponents(pageContext, model, page, exportAll, components); // 遍历当前页面所有组件,识别并处理XF组件 Iterator<Resource> componentsIterator = page.listChildren(); while (componentsIterator.hasNext()) { Resource componentResource = componentsIterator.next(); if (isExperienceFragmentComponent(componentResource)) { addExperienceFragmentData(model, componentResource); } } } private boolean isExperienceFragmentComponent(Resource resource) { return resource != null && "core/wcm/components/experiencefragment/v1/experiencefragment".equals(resource.getResourceType()); } private void addExperienceFragmentData(JsonObject parentModel, Resource xfComponent) { // 获取XF引用路径 String xfPath = xfComponent.getValueMap().get("fragmentPath", String.class); if (StringUtils.isBlank(xfPath)) { return; } Resource xfResource = xfComponent.getResourceResolver().getResource(xfPath); if (xfResource == null) { return; } ExperienceFragment experienceFragment = experienceFragmentService.getExperienceFragment(xfResource); if (experienceFragment == null) { return; } // 获取XF对应的内容页面 Page xfContentPage = experienceFragment.getContentPage(); if (xfContentPage == null) { return; } // 解析XF内容页面的组件数据并加入当前导出JSON JsonObject xfModel = new JsonObject(); super.populateComponents(null, xfModel, xfContentPage, true, null); parentModel.add("experienceFragment-" + xfComponent.getName(), xfModel); } }
2. 确保XF内部组件支持导出
如果XF内容页面中的组件需要导出JSON,需为这些组件添加@Exporter注解,示例:
@Model(adaptables = Resource.class) @Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION_JSON) public class XFHeaderComponentModel { // 组件属性与业务逻辑 }
3. 部署验证
- 将自定义
XFIncludingPageModelExporter打包部署到AEM实例 - 访问目标页面的
/model.json路径,此时页眉/页脚对应的XF组件内部JSON数据会被包含在导出结果中
注意事项
- 嵌套XF处理:若XF内部包含其他XF,可在
addExperienceFragmentData中添加递归逻辑,但需检测循环引用避免栈溢出 - 性能优化:页面包含大量XF时,建议添加缓存逻辑避免重复解析
- 权限控制:确保请求用户拥有XF内容页面的访问权限,否则无法解析数据
内容的提问来源于stack exchange,提问作者Akki
相关产品推荐
相关产品推荐

