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

先写结论:只要导入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<HttpMessageConverter<?>> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值