Custom Jackson deserializer未在Spring注册

时间:2016-10-06 09:05:44

标签: java spring jackson

我试图在Spring中用Jackson反序列化一些JSON。 我已将其配置为使用自定义MappingJackson2HttpMessageConverter,我可以看到它已注册。 仍然,在尝试反序列化时,我发现它没有使用我的自定义MappingJackson2HttpMessageConverter,而是使用了HttpMessageConverters的defaultList(换句话说,它没有被覆盖)。 知道如何解决它吗?感谢。

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

4 个答案:

答案 0 :(得分:0)

我认为您应该在被覆盖的super.configureMessageConverters(converters);结尾处拨打configureMessageConverters,或者根本不调用它,并提供其他默认转换器。

尝试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);
}

尝试2 (不调用super.configureMessageConverters)

@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();
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

感谢您的帮助。

我遇到了问题 web.xml文件中的<mvc: annotation-driven>。 因此,messageConverters将被注册两次:

  • 使用默认的messageConverters(总共9个)
  • 一次通过我的代码,只能注册一个。

使用@RequestBody处理值时,它们会被默认值(9 messageConverters)序列化而不是我的序列化(不确定这是否是随机行为,但无论如何都会产生意外结果)。

希望它有所帮助!

答案 3 :(得分:0)

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