spring mvc处理json类型返回结果异常

Tags: java spring

晚上弄个项目骨架出了点小插曲,发发牢骚……

异常情况:

一请求就是错误:    The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “accept” headers.  

http 406,请求头的accept不匹配,主要是在spring mvc中使用了@ResponseBody

解决:

缺少两个必备的包:

<dependency>
	<groupId >org.codehaus.jackson </groupId >
	<artifactId >jackson-mapper-asl </artifactId >
	<version >1.9.13 </version >
</dependency >
<dependency >
	<groupId >org.codehaus.jackson </groupId >
	<artifactId >jackson-core-asl </artifactId >
	<version >1.9.13 </version >
</dependency >

 

加入这两个依赖包即可解决。

过程:

虽然以前就了解过这个可能其中一个原因,但开始并不认为是这个,因为觉得好扯,缺少包为什么不是报异常而已报这样的错误误导别人?

所以我详细了看了一下项目的配置,因为以前这类应用是别人整的,所以报了怀疑的态度,还一路追踪了下spring校验mediatype是否匹配的过程,还是发现并没有什么问题。

这。 只能是ReponseBody的锅了,在最后将返回结果转化成json的时候错了,去看了一眼项目的依赖包,还真没有jackson相关的包,所以加了一下上面两个jar的依赖,还真OK了。

最终还是决定去看看源码为什么这里错误提示差这么多。 我们知道输入输出的转换需要通过HttpMessageConverter来进行,spring需要依赖jackson来做json与java对象的转换,所以直接看jackson相关的converter即可,如:

if (jackson2XmlPresent ) {
	 ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().applicationContext( this .applicationContext ).build();
	 messageConverters .add(newMappingJackson2XmlHttpMessageConverter( objectMapper ));
}
 else if ( jaxb2Present) {
	 messageConverters .add(newJaxb2RootElementHttpMessageConverter());
}
 if (jackson2Present ) {
	 ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext( this .applicationContext ).build();
	 messageConverters .add(newMappingJackson2HttpMessageConverter(objectMapper ));
}

 

原来不是一定启用,那在看看判断条件:

private static final boolean jackson2XmlPresent =
               ClassUtils. isPresent( "com.fasterxml.jackson.dataformat.xml.XmlMapper" , WebMvcConfigurationSupport.class .getClassLoader());

 

醉了,只有确定相关的类存在才添加相应的converter,也不会做啥提示。

如果未说明,本Blog中文章皆为原创文章,请尊重他人劳动,转载请注明:转载自jmatrix

本文链接地址:      spring mvc处理json类型返回结果异常

(注:一般引用了,我都会添加引用,如果有侵权的请联系我)

本文链接:http://www.4byte.cn/learning/119881/spring-mvc-chu-li-json-lei-xing-fan-hui-jie-guo-yi-chang.html