大家好,又见面了,我是你们的朋友全栈君。
1、406错误
发生406错误的原因是服务器传递回来的值客户端无法解析。通过在谷歌浏览器的开发浏览器查看代码,发现RequestHeader的Accept格式为application/json格式,而服务器传回的报文中ResponseHeader的格式却为text/html,导致js解析不了数据,报406错误。因此,我们需要将服务器的数据先转换成json,再将其以application/json的Content-type传回给客户端,需要导入jackson的jar包。
com.fasterxml.jackson.core
jackson-core
2.9.10
com.fasterxml.jackson.core
jackson-annotations
2.9.10
com.fasterxml.jackson.core
jackson-databind
2.9.10
jackson包的可选对象有很多,包括 com.fasterxml.jackson、org.codehaus.jackson、com.alibaba.fastjson,那么为什么要选fasterxml呢?选它的依据在哪呀?之后会提到。
显然,只导包是没有用的,我们得有工具去转换对象,这里jackson包已经给我们提供了工具类。
在讲工具类前,我们先要了解一点知识,那就是@ResponseBody这个注解:
对于没有添加@ResponseBody注解的Controller方法,其返回值应该是一个View,即一个具体的视图交给DispatcherServlet,然后由配置好的ViewResolver去解析这个View。SpringMVC框架提供了好几种视图解析器,我主要讲一个:internalResourceViewResolver,它将视图解析为Web的内部资源,通常为JSP。若方法返回的是ModelAndView,则视图解析器根据View的name来定位资源,若方法返回的是字符串,则将该字符串当作View的name,用它来定位资源。
而对于添加了@ResponseBody注解的Controller方法(等价于@RestController),其返回值不作为视图资源定位的依据,而是通过一个转换器将返回对象转换成json格式传递给调用方。org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 就是这样的一个转换器,他由Spring框架提供,能将对象转换成json格式再进行回传。
通过查看这个对象,发现它有 com.fasterxml.jackson 包对象的引用,故如果想使用它,必须导入fasterxml的jar包。
配置转换器的方式有两种:注解和非注解方式
application/json;charset=UTF-8
text/html;charset=UTF-8
注意:注解注入的转换器优先级要高于普通注入的json转换器。SpringMVC 默认只知其5个tag,分别是 mvc:annotation-driven,mvc:interceptors,mvc:view-controller,mvc:resources 和 mvc:default-servlet-handler。若要支持 mvc:message-converters 标签,需要在 classpath 下有对应 jar 包,然后配置文件配置正确:对于 spring-mvc.xml 中的 schema ,若配置为 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd,则该标签无法正常使用,而若配置为这样 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd (3.1及以上),则该标签可以正常使用。
2、在pom.xml文件中添加jackson包依赖后,仍然报错java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException的原因
通过查看导出文件夹中的lib文件,发现没有fasterxml包,这是为什么呢?
检查project structure,在artifact中发现war部署文件中没有添加新添加的fasterxml包,将其依赖添加进war部署后,重新启动成功。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126953.html原文链接:https://javaforall.cn