如何自定义Magnolia Delivery API的REST响应内容?
自定义Magnolia Delivery API响应结构
当然可以自定义Delivery API的响应内容,针对你的需求,有两种常用实现方式:
1. 配置层面的字段过滤(简单场景)
直接在你的JcrDeliveryEndpointDefinition配置中添加propertyFilter,指定需要保留的字段。系统属性(如@id、@nodeType)和自定义属性都可以通过这种方式筛选:
class: info.magnolia.rest.delivery.jcr.v2.JcrDeliveryEndpointDefinition workspace: category rootPath: / includeSystemProperties: false bypassWorkspaceAcls: true depth: 3 nodeTypes: - mgnl:folder - mgnl:category childNodeTypes: - mgnl:category - mgnl:contentNode # 添加字段过滤配置 propertyFilter: include: - '@id' # 系统节点ID - '@nodeType' # 节点类型 - 'level' # 自定义属性 - 'relatedUUID0' # 自定义关联UUID属性
注意:如果level是动态计算的字段而非节点存储的属性,这种方式可能不生效,需要用下面的自定义代码方式处理。
2. 自定义ResponseFactory(复杂场景)
如果需要更灵活的控制(比如处理动态字段、修改字段格式等),可以自定义响应工厂类,重写节点序列化逻辑:
步骤1:创建自定义ResponseFactory类
import info.magnolia.rest.delivery.jcr.v2.DefaultJcrDeliveryResponseFactory; import info.magnolia.rest.delivery.jcr.v2.NodeWrapper; import javax.jcr.Node; import java.util.HashMap; import java.util.Map; public class CustomCategoryResponseFactory extends DefaultJcrDeliveryResponseFactory { @Override protected Map<String, Object> buildNode(Node node, NodeWrapper nodeWrapper, int depth) { Map<String, Object> filteredNode = new HashMap<>(); // 添加系统属性 filteredNode.put("@id", nodeWrapper.getId()); filteredNode.put("@nodeType", nodeWrapper.getNodeType()); // 添加自定义属性 try { if (node.hasProperty("level")) { filteredNode.put("level", node.getProperty("level").getString()); } if (node.hasProperty("relatedUUID0")) { filteredNode.put("relatedUUID0", node.getProperty("relatedUUID0").getString()); } } catch (Exception e) { // 处理属性获取异常 e.printStackTrace(); } return filteredNode; } }
步骤2:更新Endpoint配置
在YAML中指定自定义的响应工厂类:
class: info.magnolia.rest.delivery.jcr.v2.JcrDeliveryEndpointDefinition workspace: category rootPath: / includeSystemProperties: false bypassWorkspaceAcls: true depth: 3 nodeTypes: - mgnl:folder - mgnl:category childNodeTypes: - mgnl:category - mgnl:contentNode # 指定自定义响应工厂 responseFactoryClass: com.yourpackage.CustomCategoryResponseFactory
部署代码并重启Magnolia后,访问原接口就会返回只包含指定字段的JSON响应。
内容的提问来源于stack exchange,提问作者seliboba98
相关产品推荐
相关产品推荐

