Java 迁移到Spring Boot 2后忽略自定义ObjectMapper
在迁移到Java 迁移到Spring Boot 2后忽略自定义ObjectMapper,java,spring-mvc,spring-boot,jackson,Java,Spring Mvc,Spring Boot,Jackson,在迁移到SpringBoot2.1.0之前,我通过扩展WebMVCConfigureAdapter配置了以下ObjectMapper @Configuration public class MvcConfig extends WebMvcConfigurerAdapter { private static final ObjectMapper objectMapper = buildObjectMapper(); private static ObjectMapper buildObject
SpringBoot2.1.0
之前,我通过扩展WebMVCConfigureAdapter
配置了以下ObjectMapper
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
private static final ObjectMapper objectMapper = buildObjectMapper();
private static ObjectMapper buildObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configOverride(LocalDate.class).
setFormat(JsonFormat.Value.forPattern("yyyy-MM-dd"));
mapper.registerModule(new JavaTimeModule());
return mapper;
}
public static ObjectMapper getObjectMapper() {
return objectMapper;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); // JSON converter
}
}
@配置
公共类MvcConfig扩展了WebMVCConfigureAdapter{
私有静态最终ObjectMapper ObjectMapper=buildObjectMapper();
私有静态对象映射器buildObjectMapper(){
ObjectMapper mapper=新的ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_案例);
setSerializationInclusion(JsonInclude.Include.NON_NULL);
configOverride(LocalDate.class)。
setFormat(JsonFormat.Value.forPattern(“yyyy-MM-dd”);
registerModule(新的JavaTimeModule());
返回映射器;
}
公共静态对象映射器getObjectMapper(){
返回对象映射器;
}
@凌驾
public void configureMessageConverters(List我认为您的映射器propertyNamingStrategy
不是通过spring boot应用程序获取的
它是从hibernatepropertyNamingStrategy
获取的。您应该试试这个
spring.jpa.hibernate.naming.physical strategy=com.example.MyPhysicalNamingStrategy
参考:docs.spring.io/spring boot/docs/current/Reference/html/
或:
@覆盖
public void extendMessageConverters(列表转换器:转换器){
if(映射Jackson2HttpMessageConverter的转换器实例){
MappingJackson2HttpMessageConverter jsonMessageConverter=(MappingJackson2HttpMessageConverter)转换器;
ObjectMapper ObjectMapper=jsonMessageConverter.getObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_案例);
打破
}
}
}
通过添加@EnableWebMvc
注释解决了我的问题,根据文档,它完全控制了Spring MVC,这不是我最初想要的,但至少是有意义的。我不清楚为什么在迁移到Spring Boot 2
之前它会工作,以及为什么要扩展Spring MVCC行为不再起作用了
如果有一个答案能很好地解释这一点,我将不胜感激,而且最好能避免@EnableWebMvc
的完全覆盖
编辑1
通常,您会为Spring MVC应用程序添加@EnableWebMvc,但Spring
Boot在屏幕上看到SpringWebMVC时会自动添加它
类路径
参考:
不幸的是,这对我来说不是一个完整的解释,因为我可以在我的类路径中看到springwebmvc:5.1.2.RELEASE
考虑到使用@EnableWebMvc
或为ObjectMapper
配置一个@Bean
都能正常工作,我将此标记为已回答。
我仍然想知道为什么需要@EnableWebMvc
,考虑到根据文档它不应该这样做。我认为你的映射程序propertyNamingStrategy不是通过spring启动应用程序获得的,而是从hibernate propertyNamingStrategy获得的。你应该试试这个。spring.jpa.hibernate.naming.physical strategy=com.example.MyPhysicalNamingStrategy Reference:问题可能出现在解析的JSON请求上,在REST控制器上,解析的对象遗漏了与默认格式不匹配的字段。此时不应涉及Hibernate,但可能存在一些Spring魔法,在任何情况下,您知道如何将此属性设置为e KEBAB_案例策略,以便我可以测试您的建议?对我来说,此属性应用于不同的用途,这就是我感到困惑的原因。您可以尝试我的建议并提供反馈。我认为它会起作用。我尝试了您的第二个建议,我用您的扩展消息转换器替换了配置消息转换器
然而,还是同样的问题,在这样做的同时,我决定尝试更改我的LocalDate
格式,看看它是否有任何区别,这也被忽略了。我认为这是一个更一般的配置问题,因为我的自定义ObjectMapper
似乎被完全忽略了。我正在查看最新的文档为了了解我做错了什么,到目前为止,我还没有在Spring Boot 2
文档中发现这些方面有什么大的不同。找到了一个避免@EnableWebMvc完全覆盖的解决方案了吗?我找不到需要@EnableWebMvc
的原因,所以我最终为pro删除了@EnableWebMvc
我正在开发并使用一个ObjectMapper
bean的对象映射器。我没有任何计划回到这个问题上来,但我想了解为什么它在一开始不起作用,因为我的整个包装器被忽略了,在任何情况下,你都可以检查我在我的项目中做了什么,看看它是否有任何帮助:谢谢你的示例。我面临着自找的问题ems是由于在一个测试过的DTO上遗留了@JsonFormat
。最后,我能够通过提供一个Jackson2ObjectMapperBuilderCustomizer
bean来实现我所需要的。
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJackson2HttpMessageConverter) {
MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
break;
}
}
}