自定义 JSON 输出

有时在您的应用程序中,需要从某个实体提供指向其他资源的链接。例如,Customer 响应可能会被补充添加指向当前购物车的链接,或指向用于管理与该实体相关资源的链接。Spring Data REST 提供了与 Spring HATEOAS 的集成,并提供了一个扩展钩子,允许您修改发送给客户端的资源表示形式。spring-doc.cadn.net.cn

RepresentationModelProcessor接口

Spring HATEOAS 定义了一个 RepresentationModelProcessor<> 接口用于处理实体。所有类型为 RepresentationModelProcessor<EntityModel<T>> 的 Bean 都会被 Spring Data REST 导出器自动识别,并在序列化类型为 T 的实体时触发。spring-doc.cadn.net.cn

例如,要为 Person 实体定义一个处理器,请向您的 @Bean 中添加一个类似于以下示例的 ApplicationContext(该示例取自 Spring Data REST 的测试代码):spring-doc.cadn.net.cn

@Bean
public RepresentationModelProcessor<EntityModel<Person>> personProcessor() {

   return new RepresentationModelProcessor<EntityModel<Person>>() {

     @Override
     public EntityModel<Person> process(EntityModel<Person> model) {

      model.add(new Link("http://localhost:8080/people", "added-link"));
      return model;
     }
   };
}
前面的示例将链接硬编码到 localhost:8080/people。如果您希望链接到应用程序内部的 Spring MVC 端点,请考虑使用 Spring HATEOAS 的 linkTo(…​) 方法,以避免管理 URL。

您可以像前面的示例所示,通过调用 model.add(Link) 向实体的默认表示形式添加链接。您添加到 EntityModel 中的任何链接都会包含在最终输出中。spring-doc.cadn.net.cn

自定义表示方式

Spring Data REST 导出器在生成输出表示之前,会运行所有发现的 RepresentationModelProcessor 实例。它通过向内部的 Converter<Entity, EntityModel> 注册一个 ConversionService 实例来实现这一点。该组件负责为引用的实体创建链接(例如,在对象 JSON 表示中 _links 属性下的那些对象)。它接收一个 @Entity,遍历其属性,并为那些由 Repository 管理的属性创建链接,同时复制所有嵌入式或简单属性。spring-doc.cadn.net.cn

然而,如果你的项目需要以不同的格式输出,你可以完全用自己的实现替换默认的 JSON 输出表示。如果你在 ConversionService 中注册了自己的 ApplicationContext,并注册了你自己的 Converter<Entity, EntityModel>,那么你就可以返回你自己选择的 EntityModel 实现。spring-doc.cadn.net.cn