gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:53:10 24 4
gpt4 key购买 nike

我喜欢在我的项目中使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com