Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迁移到Spring Boot 2后忽略自定义ObjectMapper_Java_Spring Mvc_Spring Boot_Jackson - Fatal编程技术网

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应用程序获取的
它是从hibernate
propertyNamingStrategy
获取的。您应该试试这个

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;
            }
        }
    }