Java 覆盖MappingJackson2HttpMessageConverter以支持HAL+JSON可以吗?

Java 覆盖MappingJackson2HttpMessageConverter以支持HAL+JSON可以吗?,java,spring,rest,spring-hateoas,hal-json,Java,Spring,Rest,Spring Hateoas,Hal Json,在我的Spring Boot应用程序中,我已将HAL对象映射器分配给MappingJackson2HttpMessageConverter。这是因为我的自定义媒体类型以+json结尾,并最终被默认转换器识别。Spring HATEOAS注册的定制MappingJackson2HttpMessageConverter实例只识别application/hal+json。我的自定义媒体类型的格式为application/vnd.service.entity.v1.hal+json,这是默认实例可以识别

在我的Spring Boot应用程序中,我已将HAL对象映射器分配给MappingJackson2HttpMessageConverter。这是因为我的自定义媒体类型以+json结尾,并最终被默认转换器识别。Spring HATEOAS注册的定制MappingJackson2HttpMessageConverter实例只识别application/hal+json。我的自定义媒体类型的格式为application/vnd.service.entity.v1.hal+json,这是默认实例可以识别的,因为它支持application/json和application/*+json。但是,默认实例没有将链接正确序列化到HAL约定中。我已经能够通过注册地图绘制者绕过它,如下所示:

@Bean
public HttpMessageConverters customConverters() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(Arrays.asList(
            new MediaType("application", "json", Charset.defaultCharset()),
            new MediaType("application", "*+json", Charset.defaultCharset()),
            new MediaType("application", "hal+json")
    ));

    ObjectMapper halObjectMapper = beanFactory.getBean(HAL_OBJECT_MAPPER_BEAN_NAME, ObjectMapper.class);
    converter.setObjectMapper(halObjectMapper);

    return new HttpMessageConverters(converter);
}

有一个问题是,我现在用HAL问题污染了常规JSON序列化/反序列化,但除了显式指定我用于此操作的每个自定义媒体类型之外,我想不出任何其他方法。想法?

根据我的经验,我可以告诉你,HAL序列化程序有点被黑客攻击了,根本不能很好地使用spring boot。我们删除内置的一个,并根据内置的一个注册我们自己的。内置的链接有什么特别的错误?当你包括Spring Hateo时,你可以从盒子里得到HAL支持。它不依赖于媒体类型。我不明白你想达到什么目的。Spring HATEOAS不支持哪些功能?zeroflagL是的,它为您提供了现成的HAL支持,但您必须特别通过使用注释来启用HAL格式的序列化。但是,即使使用该注释,标准json转换器也可以识别像application/vnd.service.entity.v1.hal+json这样的媒体类型,因为它可以识别application/*+json,而hal转换器只能识别application/hal+json。因此,您没有在HAL+JSON约定中正确序列化链接。@ChrisDaMour当您使用@EnableHypermediaSupporttype=EnableHypermediaSupport.HypermediaType.HAL进行HAL+JSON序列化时,您会得到HAL格式的链接,其中_links属性具有REL作为键。如果不这样做,就会得到一个对象数组,其中rel是一个属性。所以问题是,即使使用注释,Spring HATEOAS附带的标准转换器也无法识别自定义媒体类型。因此,您必须覆盖标准JSON转换器才能使用HAL映射器。对不起,我仍然不理解这个问题。假设我有一个控制器方法来获取Person类型的实体,媒体类型为application/vnd.mycompany.Person+json。我会有一个DTO公开链接,可能会扩展ResourceSupport。除了添加@EnableHypermediaSupport之外,没有什么办法可以让链接按照HAL格式正确序列化。