草庐IT

java - 如何配置spring-hateoas注册的MappingJackson2HttpMessageConverter

coder 2023-05-11 原文

我喜欢在我的项目中使用 spring-hateoas 并将其配置为 @EnableHypermediaSupport . 现在的问题是,这个神奇的配置注释注册了它自己的 MappingJackson2HttpMessageConverter我自己定制的转换器将被忽略。

背景:我在我的项目中添加了一些 Jackson 模块(如 JodaModule),我希望它们使用 objectMapper.findAndRegisterModules(); 进行注册.这是通过覆盖 configureMessageConverters(List<HttpMessageConverter<?>> converters) 来完成的。在 WebMvcConfigurationSupportWebMvcConfigurer .

我当前的配置如下:

@Configuration
@EnableHypermediaSupport(type = HAL)
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

  @Override
  protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.getObjectMapper().findAndRegisterModules();

    converters.add(converter);
  }
}

有没有办法自定义MappingJackson2HttpMessageConverterObjectMapper spring-hateoas 使用的那个?

最佳答案

我不得不做同样的事情。使用 HATEOAS .16,我能够正常工作..但真的很丑。

关键在于,在 HypermediaSupportBeanDefinitionRegistrar 中,注册 HAL 转换器的部分会在尝试添加另一个 HAL 转换器之前检查是否已经存在 HAL 转换器。所以我自己在我的 WebMVCConfig::configureMessageConverters 中添加了一个 HAL 转换器。

类似:

private static final String DELEGATING_REL_PROVIDER_BEAN_NAME = "_relProvider";
private static final String LINK_DISCOVERER_REGISTRY_BEAN_NAME = "_linkDiscovererRegistry";
private static final String HAL_OBJECT_MAPPER_BEAN_NAME = "_halObjectMapper";

@Autowired
private ListableBeanFactory beanFactory;

private static CurieProvider getCurieProvider(BeanFactory factory) {

    try {
        return factory.getBean(CurieProvider.class);
    } catch (NoSuchBeanDefinitionException e) {
        return null;
    }
}

@Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        List<HttpMessageConverter<?>> baseConverters = new ArrayList<HttpMessageConverter<?>>();
        super.configureMessageConverters(baseConverters);

        //Need to override some behaviour in the HAL Serializer...so let's make our own
        CurieProvider curieProvider = getCurieProvider(beanFactory);
        RelProvider relProvider = beanFactory.getBean(DELEGATING_REL_PROVIDER_BEAN_NAME, RelProvider.class);
        ObjectMapper halObjectMapper = beanFactory.getBean(HAL_OBJECT_MAPPER_BEAN_NAME, ObjectMapper.class);

        halObjectMapper.registerModule(new Jackson2HalModule());
        halObjectMapper.setHandlerInstantiator(new Jackson2HalModule.HalHandlerInstantiator(relProvider, curieProvider));

        MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter(
            ResourceSupport.class);
        halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON));
        halConverter.setObjectMapper(halObjectMapper);

        converters.add(halConverter);
    }

这显然依赖于实现,使用实现细节,并且确实不允许您修改 @EnableHyperMediaSupport 为您构建的那个....但它现在可以工作。

关于java - 如何配置spring-hateoas注册的MappingJackson2HttpMessageConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24694493/

有关java - 如何配置spring-hateoas注册的MappingJackson2HttpMessageConverter的更多相关文章

随机推荐