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