我试图在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()));
}
}
答案 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将被注册两次:
使用@RequestBody处理值时,它们会被默认值(9 messageConverters)序列化而不是我的序列化(不确定这是否是随机行为,但无论如何都会产生意外结果)。
希望它有所帮助!
答案 3 :(得分:0)
这些答案中的许多都很好看。此外,如果您使用的是Spring Boot,请确保您的配置中没有@EnableWebMvc注释。我花了很多时间尝试了许多不同的方式(其中一些记录在问题和响应中)来注册/配置自定义Jackson序列化器和反序列化器,其中没有一个正常工作。在调试时我可以看到在应用程序启动时调用了注册代码,但是从未调用过De / Serializers。显然@EnableWebMvc在Spring Boot环境中覆盖了这些注册。简单地删除此注释使一切都按预期工作。