SpringMVC使用JSON返回对象遇到的问题。

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

先写结论:只要导入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这两个包就可以实现了。

转载于:https://my.oschina.net/wuqingyi/blog/1793902

你可能感兴趣的:(SpringMVC使用JSON返回对象遇到的问题。)