Spring 数据休息 - 自定义 Json 架构/Alps?
Spring Data Rest - Custom Json Schema / Alps?
我需要向将使用 API 的客户端应用程序提供有关数据约束或默认值的信息。 Spring Data Rest
生成的架构或 ALPS 似乎是放置此信息的好地方。
但是关于记录 API 的部分在官方参考文档中有点快,我在社区中找不到完整记录的示例。我试图阅读 PersistentEntityToJsonSchemaConverter
的代码以深入了解所提供的可能性,但首先让我头疼的是。
我知道我可以在实体和属性上添加 @Description
注释,这将更改架构的 title
字段。
我知道可以在 rest-messages.properties
中修改相同的字段
是否还有其他字段可以通过注释或配置文件修改?
把default或者constraints信息放在这个description字段里,真的感觉不是直接用的。
问题差不多老了,不知道大家有没有找到解决办法
如果您构建两个自定义转换器来替换 Spring.
使用的转换器,则可以在任何地方构建完全自定义的 ALPS 分析信息
第一个需要扩展转换器org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter
。
这里是一个可能的实现:
public class CustomAlpsJsonHttpMessageConverter extends AlpsJsonHttpMessageConverter {
public CustomAlpsJsonHttpMessageConverter(RootResourceInformationToAlpsDescriptorConverter converter) {
super(converter);
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return super.canWrite(clazz, mediaType);
}
@Override
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
return super.canRead(type, contextClass, mediaType);
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
return super.beforeBodyWrite(body, returnType, selectedContentType, selectedConverterType, request, response);
}
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return converterType.equals(AlpsJsonHttpMessageConverter.class)
|| converterType.equals(CustomAlpsJsonHttpMessageConverter.class);
}
}
第二个需要扩展转换器org.springframework.data.rest.webmvc.alps.RootResourceInformationToAlpsDescriptorConverter
。
RootResourceInformationToAlpsDescriptorConverter
只有两个 public 资源:构造函数和 "convert" 方法。
如果您想拥有自定义行为,您可以覆盖 class 的每个私有 field/method。
请注意,CustomAlpsJsonHttpMessageConverter
的 "supports" 方法需要匹配给定的 "converterType" 和你的新 CustomAlpsJsonHttpMessageConverter
class.
那时你可以自定义classRootResourceInformationToAlpsDescriptorConverter
的"convert"方法,只需在你的CustomRootResourceInformationToAlpsDescriptorConverter
.
最后,您必须在应用程序上下文中注册这两个转换器。为此,您可以扩展 RepositoryRestMvcConfiguration
class,在您的 CustomRepositoryRestMvcConfiguration
中,您需要 @Override
方法 "alpsJsonHttpMessageConverter()"
和 "alpsConverter()"
.
在两个覆盖的自定义方法中也添加 @Bean
注释,如下所示:
@Bean
@Override
public AlpsJsonHttpMessageConverter alpsJsonHttpMessageConverter() {
return new CustomAlpsJsonHttpMessageConverter(alpsConverter());
}
@Bean
@Override
public RootResourceInformationToAlpsDescriptorConverter alpsConverter() {
Repositories repositories = repositories();
PersistentEntities persistentEntities = persistentEntities();
RepositoryEntityLinks entityLinks = entityLinks();
MessageSourceAccessor messageSourceAccessor = resourceDescriptionMessageSourceAccessor();
RepositoryRestConfiguration config = config();
ResourceMappings resourceMappings = resourceMappings();
return new CustomRootResourceInformationToAlpsDescriptorConverter(associationLinks(), repositories, persistentEntities,
entityLinks, messageSourceAccessor, config, objectMapper(), enumTranslator());
}
因此,如果需要,您可以拥有完全定制的 ALPS。
我已经尝试使用此解决方案来构建自定义分析链接,并且效果很好。
我需要向将使用 API 的客户端应用程序提供有关数据约束或默认值的信息。 Spring Data Rest
生成的架构或 ALPS 似乎是放置此信息的好地方。
但是关于记录 API 的部分在官方参考文档中有点快,我在社区中找不到完整记录的示例。我试图阅读 PersistentEntityToJsonSchemaConverter
的代码以深入了解所提供的可能性,但首先让我头疼的是。
我知道我可以在实体和属性上添加 @Description
注释,这将更改架构的 title
字段。
我知道可以在 rest-messages.properties
是否还有其他字段可以通过注释或配置文件修改? 把default或者constraints信息放在这个description字段里,真的感觉不是直接用的。
问题差不多老了,不知道大家有没有找到解决办法
如果您构建两个自定义转换器来替换 Spring.
使用的转换器,则可以在任何地方构建完全自定义的 ALPS 分析信息第一个需要扩展转换器org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter
。
这里是一个可能的实现:
public class CustomAlpsJsonHttpMessageConverter extends AlpsJsonHttpMessageConverter {
public CustomAlpsJsonHttpMessageConverter(RootResourceInformationToAlpsDescriptorConverter converter) {
super(converter);
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
return super.canWrite(clazz, mediaType);
}
@Override
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
return super.canRead(type, contextClass, mediaType);
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
return super.beforeBodyWrite(body, returnType, selectedContentType, selectedConverterType, request, response);
}
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return converterType.equals(AlpsJsonHttpMessageConverter.class)
|| converterType.equals(CustomAlpsJsonHttpMessageConverter.class);
}
}
第二个需要扩展转换器org.springframework.data.rest.webmvc.alps.RootResourceInformationToAlpsDescriptorConverter
。
RootResourceInformationToAlpsDescriptorConverter
只有两个 public 资源:构造函数和 "convert" 方法。
如果您想拥有自定义行为,您可以覆盖 class 的每个私有 field/method。
请注意,CustomAlpsJsonHttpMessageConverter
的 "supports" 方法需要匹配给定的 "converterType" 和你的新 CustomAlpsJsonHttpMessageConverter
class.
那时你可以自定义classRootResourceInformationToAlpsDescriptorConverter
的"convert"方法,只需在你的CustomRootResourceInformationToAlpsDescriptorConverter
.
最后,您必须在应用程序上下文中注册这两个转换器。为此,您可以扩展 RepositoryRestMvcConfiguration
class,在您的 CustomRepositoryRestMvcConfiguration
中,您需要 @Override
方法 "alpsJsonHttpMessageConverter()"
和 "alpsConverter()"
.
在两个覆盖的自定义方法中也添加 @Bean
注释,如下所示:
@Bean
@Override
public AlpsJsonHttpMessageConverter alpsJsonHttpMessageConverter() {
return new CustomAlpsJsonHttpMessageConverter(alpsConverter());
}
@Bean
@Override
public RootResourceInformationToAlpsDescriptorConverter alpsConverter() {
Repositories repositories = repositories();
PersistentEntities persistentEntities = persistentEntities();
RepositoryEntityLinks entityLinks = entityLinks();
MessageSourceAccessor messageSourceAccessor = resourceDescriptionMessageSourceAccessor();
RepositoryRestConfiguration config = config();
ResourceMappings resourceMappings = resourceMappings();
return new CustomRootResourceInformationToAlpsDescriptorConverter(associationLinks(), repositories, persistentEntities,
entityLinks, messageSourceAccessor, config, objectMapper(), enumTranslator());
}
因此,如果需要,您可以拥有完全定制的 ALPS。
我已经尝试使用此解决方案来构建自定义分析链接,并且效果很好。