我喜欢在我的项目中使用 spring-hateoas 并将其配置为 @EnableHypermediaSupport .
现在的问题是,这个神奇的配置注释注册了它自己的 MappingJackson2HttpMessageConverter我自己定制的转换器将被忽略。
背景:我在我的项目中添加了一些 Jackson 模块(如 JodaModule),我希望它们使用 objectMapper.findAndRegisterModules(); 进行注册.这是通过覆盖 configureMessageConverters(List<HttpMessageConverter<?>> converters) 来完成的。在 WebMvcConfigurationSupport或 WebMvcConfigurer .
我当前的配置如下:
@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);
}
}
有没有办法自定义MappingJackson2HttpMessageConverter或 ObjectMapper 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/