自定义 JSON 输出

在您的应用程序中,有时您需要从特定实体提供指向其他资源的链接。例如,Customer 响应可能通过指向当前购物车的链接或指向管理与该实体相关的资源的链接来进行丰富。Spring Data REST 提供与 Spring HATEOAS 的集成,并提供了一个扩展钩子,允许您更改发送到客户端的资源表示。

RepresentationModelProcessor 接口

Spring HATEOAS 定义了一个用于处理实体的 RepresentationModelProcessor<> 接口。所有类型为 RepresentationModelProcessor<EntityModel<T>> 的 Bean 会被 Spring Data REST 导出器自动拾取,并在序列化类型为 T 的实体时触发。

例如,要为 Person 实体定义一个处理器,请将类似于以下内容的 @Bean(取自 Spring Data REST 测试)添加到您的 ApplicationContext

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

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

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

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

您可以通过调用 model.add(Link) 向实体的默认表示添加链接,如上面的示例所示。您添加到 EntityModel 的任何链接都会添加到最终输出中。

自定义表示

Spring Data REST 导出器在创建输出表示之前会运行任何发现的 RepresentationModelProcessor 实例。它通过在内部 ConversionService 中注册一个 Converter<Entity, EntityModel> 实例来实现这一点。这是负责创建指向引用实体的链接(例如对象 JSON 表示中 _links 属性下的那些对象)的组件。它接受一个 @Entity 并遍历其属性,为由 Repository 管理的属性创建链接,并将任何嵌入或简单属性复制过去。

但是,如果您的项目需要以不同的格式输出,您可以完全用自己的格式替换默认的传出 JSON 表示。如果您在 ApplicationContext 中注册自己的 ConversionService 并注册自己的 Converter<Entity, EntityModel>,您可以返回您选择的 EntityModel 实现。