自定义ObjectMapper迁移到Spring Boot 2后被忽略

时间:2018-11-19 06:12:50

标签: java spring-mvc spring-boot jackson

在迁移到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 AssuredRestAssuredConfig共享同一实例,并且似乎仍在如预期的那样,如果我将自定义映射器更新为默认行为(注释setPropertyNamingStrategy),一切似乎都可以按预期进行。

编辑1

实际上我的整个映射器都被忽略了,我尝试更改LocalDate格式,这也没有任何区别。更新标题以更好地反映问题。

2 个答案:

答案 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