定制 JSON 输出
在应用程序中,有时需要从特定实体提供指向其他资源的链接。例如,一个 Customer
响应可以包含指向当前购物车或管理该实体相关资源的链接。Spring Data REST 集成了 Spring HATEOAS 并提供了一个扩展点,允许您修改发送给客户端的资源的表现形式。
RepresentationModelProcessor
接口
Spring HATEOAS 定义了一个用于处理实体的 RepresentationModelProcessor<>
接口。所有类型为 RepresentationModelProcessor<EntityModel<T>>
的 Bean 会被 Spring Data REST exporter 自动检测到,并在序列化类型为 T
的实体时触发。
例如,要为 Person
实体定义一个处理器,请将类似于以下内容(取自 Spring Data REST 测试)的 @Bean
添加到您的 ApplicationContext
中
@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。 |
定制表现形式
Spring Data REST exporter 在创建输出表现形式之前会运行所有发现的 RepresentationModelProcessor
实例。它通过向内部 ConversionService
注册一个 Converter<Entity, EntityModel>
实例来实现这一点。这是负责创建指向引用实体链接的组件(例如对象 JSON 表现形式中 _links
属性下的对象)。它接受一个 @Entity
,并遍历其属性,为由 Repository
管理的属性创建链接,并复制任何嵌入式或简单属性。
但是,如果您的项目需要以不同的格式输出,则可以完全用您自己的实现替换默认的 JSON 输出表现形式。如果您在 ApplicationContext
中注册自己的 ConversionService
并注册自己的 Converter<Entity, EntityModel>
,则可以返回您选择的 EntityModel
实现。