2019独角兽企业重金招聘Python工程师标准>>>
先写结论:只要导入jackson-databind和jackson-core这两个包就可以了。
这几天在看《Java EE开发的颠覆者:Spring Boot实战》这本书,边敲代码练习,在添加jackson及其依赖,获得对象和json之间的转换的时候,遇到了很多问题。
我是按照书上写的配置的,没有导入jackson-dataformat-xml而用jackson-databind,但是spring的version我设置为RELEASE,结果报错了;
改为书上的版本还是有问题;
网上看说添加Jackson另外的jackson-core和jackson-annotations包,还是报错(这个可能是因为maven没有刷新的问题,或者和spring的版本不兼容造成的);
添加一个jsp页面,content_type换成“application/json”,还是报错;
在Java配置类中重写extendMessageConverters方法,还是报错;
最后,换回了jackson-dataformat-xml,竟然可以用了。
有以下几种错误:
1.java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException
2.Could not find acceptable representation
下面是重点:
今天在看Java配置类继承的WebMvcConfigurationSupport这个类的时候,发现这个类有一个
addDefaultHttpMessageConverters方法,
protected final void addDefaultHttpMessageConverters(List> messageConverters) {
......
if (jackson2Present) {
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
if (this.applicationContext != null) {
builder.applicationContext(this.applicationContext);
}
messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}
......
}
这个MappingJackson2HttpMessageConverter就是我上面试图在Java配置类中重写extendMessageConverters方法,要添加的Converter类,竟然在这里出现了,再看看jackson2Present是什么条件。
private static final boolean jackson2Present =
ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper",
WebMvcConfigurationSupport.class.getClassLoader()) &&
ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator",
WebMvcConfigurationSupport.class.getClassLoader());
原来是根据查找ObjectMapper和JsonGenertor这两个类来决定是否要加载MappingJackson2HttpMessageConverter。而ObjectMapper和JsonGenertor两个类分别在Jackson的jackson-databind和jackson-core这两个包中。因此,只要导入jackson-databind和jackson-core这两个包就可以实现了。