Java 自定义Jackson反序列化程序未在Spring中注册

Java 自定义Jackson反序列化程序未在Spring中注册,java,spring,jackson,Java,Spring,Jackson,我正在尝试在春季与Jackson反序列化一些JSON。 我已将其配置为使用自定义MappingJackson2HttpMessageConverter,并且可以看到它已注册。 尽管如此,在尝试反序列化时,我发现它并没有使用我的自定义MappingJackson2HttpMessageConverter,而是使用HttpMessageConverter的默认列表(换句话说,它没有被覆盖)。 你知道怎么解决吗?谢谢 package com.bigid.scanner.service.restapi;

我正在尝试在春季与Jackson反序列化一些JSON。 我已将其配置为使用自定义MappingJackson2HttpMessageConverter,并且可以看到它已注册。 尽管如此,在尝试反序列化时,我发现它并没有使用我的自定义MappingJackson2HttpMessageConverter,而是使用HttpMessageConverter的默认列表(换句话说,它没有被覆盖)。 你知道怎么解决吗?谢谢

package com.bigid.scanner.service.restapi;

import com.bigid.scanner.api.datalink.DataLink;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.text.SimpleDateFormat;
import java.util.List;

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.mixIn(DataLink.class, PolymorphicDataLinkMixin.class);
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }
}
package com.bigid.scanner.service.restapi;
导入com.bigid.scanner.api.datalink.datalink;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.http.converter.HttpMessageConverter;
导入org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
导入org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
导入org.springframework.web.servlet.config.annotation.EnableWebMvc;
导入org.springframework.web.servlet.config.annotation.WebMVCConfigureAdapter;
导入java.text.simpleDataFormat;
导入java.util.List;
@配置
@EnableWebMvc
公共类网络配置扩展了WebMVCConfigureAdapter{
@凌驾

public void configureMessageConverters(List我认为您应该在覆盖的
configureMessageConverters
末尾调用
super.configureMessageConverters(converters);
,或者根本不调用它并提供其他默认转换器

尝试1

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.mixIn(DataLink.class, PolymorphicDataLinkMixin.class);
    converters.add(new MappingJackson2HttpMessageConverter(builder.build()));

    super.configureMessageConverters(converters);
}
@覆盖
public void configureMessageConverters(列表>转换器){
Jackson2ObjectMapperBuilder=新Jackson2ObjectMapperBuilder();
builder.mixIn(DataLink.class,linkmixin.class);
添加(新映射Jackson2HttpMessageConverter(builder.build());
super.addDefaultHttpMessageConverters();
}
@配置
@EnableWebMvc
公共类网络配置扩展了WebMVCConfigureAdapter{
protected void configureMessageConverters(列表感谢您的帮助

问题是我有
在web.xml文件中。 因此,MessageConverter将被注册两次:

  • 一次使用默认的messageConverters(共9个)
  • 我的代码只注册了一次
在使用@RequestBody处理值时,它们将由默认值(9个messageConverters)序列化,而不是由我序列化(不确定这是否是随机行为,但在任何情况下都会产生意外结果)


希望它能帮助别人!

这些答案中有很多看起来不错。此外,如果您使用的是Spring Boot,请确保您的配置中没有@EnableWebMvc注释。我花了很多时间尝试了许多不同的方法(其中一些方法记录在这里的问题和回答中)注册/配置自定义Jackson序列化程序和反序列化程序,这些程序都不能正常工作。在调试时,我可以看到在应用程序启动时调用了注册代码,但从未调用过反序列化程序。显然,@EnableWebMvc在Spring引导环境中覆盖了这些注册。只需删除使用此注释使一切都按预期工作

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.mixIn(DataLink.class, PolymorphicDataLinkMixin.class);
    converters.add(new MappingJackson2HttpMessageConverter(builder.build()));

    super.addDefaultHttpMessageConverters();
}
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

        protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(converter());
            addDefaultHttpMessageConverters(converters);
        }

        @Bean
        MappingJacksonHttpMessageConverter converter() {
            MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter()
            //do your customizations here...
            return converter;
        }
    }