Customizing the JSON Output

有时在您的应用程序中,您需要从特定实体提供到其他资源的链接。例如,`Customer`响应可以用链接到当前购物车,或到管理与该实体相关的资源的链接来丰富。Spring Data REST 提供与 Spring HATEOAS的集成,并提供一个扩展挂钩,供您更改传递到客户端的资源的表示形式。

The RepresentationModelProcessor Interface

Spring HATEOAS 定义了一个用于处理实体的 RepresentationModelProcessor<> 接口。Spring Data REST 导出程序将自动选取类型为 RepresentationModelProcessor<EntityModel<T>> 的所有 bean,并在对类型为 T 的实体进行序列化时触发这些 bean。

例如,为了为 Person 实体定义一个处理器,可以向 ApplicationContext 中添加一个类似于下面的 @Bean(取自 Spring Data REST 测试):

@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;
     }
   };
}

前面示例将硬编码链接到 http://localhost:8080/people 。如果在应用内有一个希望链接的 Spring MVC 终端, 请考虑使用 Spring HATEOAS 的 linkTo(…​) 方法, 以免管理 URL 。

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

Customizing the Representation

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

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