跳到主要内容

自定义 JSON 输出

DeepSeek V3 中英对照 Customizing the JSON Output

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

RepresentationModelProcessor 接口

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

例如,要为 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;
}
};
}
java
important

前面的示例硬编码了一个指向 [localhost:8080/people](http://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 实现。