在迁移到Spring Boot 2.1.0
之前,我通过扩展ObjectMapper
的预期工作来配置以下WebMvcConfigurerAdapter
。
@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
}
}
但是,在迁移之后,我看到设置PropertyNamingStrategy似乎无效,我的应用程序仍希望JSON
字段的格式与默认值匹配(例如,按预期要求使用“ bloodType”而不是“ blood-type” )。
我认为映射器本身没有任何问题,因为我使用静态getObjectMapper
通过REST Assured
与RestAssuredConfig
共享同一实例,并且似乎仍在如预期的那样,如果我将自定义映射器更新为默认行为(注释setPropertyNamingStrategy
),一切似乎都可以按预期进行。
编辑1
实际上我的整个映射器都被忽略了,我尝试更改LocalDate
格式,这也没有任何区别。更新标题以更好地反映问题。
答案 0 :(得分:2)
我认为您的映射器propertyNamingStrategy
不是从休眠spring boot application
那里获取的,propertyNamingStrategy
是您应该尝试的。
spring.jpa.hibernate.naming.physical-strategy=com.example.MyPhysicalNamingStrategy
参考:docs.spring.io/spring-boot/docs/current/reference/html/…
OR:
@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;
}
}
}
答案 1 :(得分:0)
我的问题通过添加@EnableWebMvc
注释得以解决,根据文档所述,该注释可以完全控制Spring MVC,这并不是我最初想要的,但至少是有道理的。对于我来说,目前尚不清楚为什么在迁移到Spring Boot 2
之前它可以正常工作,以及为什么扩展Spring MVC行为不再有效。
我很高兴能为您提供一个很好的解释的答案,并且最好避免使用@EnableWebMvc
进行完全覆盖。
编辑1
通常,您将为Spring MVC应用添加@EnableWebMvc,但是Spring 引导程序在计算机上看到 spring-webmvc 时,会自动添加它。 类路径。
参考:https://spring.io/guides/gs/serving-web-content/
不幸的是,这对我来说不是一个完整的解释,因为我可以在类路径中看到spring-webmvc:5.1.2.RELEASE
。
考虑到使用@EnableWebMvc
或为@Bean
配置一个ObjectMapper
可以正常工作,我将其标记为已回答。
根据文档,我仍然想知道为什么需要@EnableWebMvc
。