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。

我已经尝试使用此解决方案来构建自定义分析链接,并且效果很好。