自定义 JSON 输出
有时在您的应用程序中,您需要从特定实体提供指向其他资源的链接。例如,Customer 响应可能通过指向当前购物车或用于管理与该实体相关的资源的链接进行丰富。Spring Data REST 提供与 Spring HATEOAS 的集成,并提供一个扩展钩子,允许您更改发送给客户端的资源表示。
RepresentationModelProcessor 接口
Spring HATEOAS 定义了一个用于处理实体的 RepresentationModelProcessor<> 接口。所有类型为 RepresentationModelProcessor<EntityModel<T>> 的 bean 都会被 Spring Data REST 导出器自动拾取,并在序列化类型为 T 的实体时触发。
例如,要为 Person 实体定义处理器,请在您的 ApplicationContext 中添加一个类似于以下示例(取自 Spring Data REST 测试)的 @Bean:
@Bean
public RepresentationModelProcessor<EntityModel<Person>> personProcessor() {
return new RepresentationModelProcessor<EntityModel<Person>>() {
@Override
public EntityModel<Person> process(EntityModel<Person> model) {
model.add(new Link("https://:8080/people", "added-link"));
return model;
}
};
}
前面的示例硬编码了指向 localhost:8080/people 的链接。如果您的应用程序中有一个 Spring MVC 端点希望链接到,请考虑使用 Spring HATEOAS 的 linkTo(…) 方法,以避免管理 URL。 |
自定义表示
Spring Data REST 导出器在创建输出表示之前运行所有发现的 RepresentationModelProcessor 实例。它通过向内部 ConversionService 注册一个 Converter<Entity, EntityModel> 实例来完成此操作。这是负责创建引用实体链接的组件(例如对象 JSON 表示中 _links 属性下的那些对象)。它接受一个 @Entity 并遍历其属性,为由 Repository 管理的属性创建链接,并复制任何嵌入或简单属性。
但是,如果您的项目需要以不同格式输出,您可以完全用您自己的格式替换默认的传出 JSON 表示。如果您在 ApplicationContext 中注册您自己的 ConversionService 并注册您自己的 Converter<Entity, EntityModel>,您可以返回您选择的 EntityModel 实现。