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

如何在页面级获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:18:28