今天在进行前后端分离,希望spring后端接口返回json报文供前端使用,遇到了406 (Not Acceptable)错误,
在网上查找了各种教程,发现需要有些注意点
1.首先需要在Controller中设置:
@RequestMapping和@Response
@RequestMapping(value = "/findAll.json", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
@ResponseBody
public List<Admin> findAll(@RequestBody String test) {
List<Admin> adminList = adminService.queryForLogin("sds", "sd");
return adminList;
}
2.引入Jackson相关的包
这里需要注意的是包的版本需要和spring的版本相匹配,我的spring版本是5.0.7.RELEASE,发现5.X.X的需要使用的Jackson版本是2.9.X。这里我使用2.9.8是没有问题的。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
3.查询到结果
4.spring返回对象格式设置参考
SpringMVC——-Controller返回格式化数据如JSON、XML的配置方式和机制
4.1、数据类型转换
SpringMVC提供了一种数据转换机制,这种机制可以根据预先设定的media type,调用合适的转换器将数据转换成合适的类型。
4.2、默认包含的转换器
SpringMVC默认包含一系列的数据转换器,此处不一一列举,就介绍几种常用的。
MappingJackson2XmlHttpMessageConverter 基于Jackson的XML转换器,能够将对象转换成XML格式的数据
MappingJackson2HttpMessageConverter 基于 Jackson 的JSON转换器,能够将对象转换成JSON格式的数据
GsonHttpMessageConverter 基于Gson的JSON转换器,能够将对象转换成JSON格式数据
对于系统中默认包含的转换器,只要我们在项目中加入转换器所依赖的JAR包,相关转换器就会被加载。
4.3、设置数据转换类型 media type
现在我们明确了如何允许控制器直接将返回结果写入响应体中,并且明确了处理器将返回的数据写入响应体之前会进行相应的转换。
但是根据我们的了解,我们发现SpringMVC中默认携带的转换器不止一种,那么我们如何确定处理器返回的数据交给合适的转换器,转换成我们想要的数据类型呢?
只需要使用 @ReuqestMapping注解的一个参数进行设置即
4.4、系统默认的设置的 media type
在一些简单的环境中,比如项目返回的数据类型只需要JSON格式,可能就不需要设置 produces的类型,来指定 media type,也能够按照要求返回正常的JSON数据,这是为什么?
因为SpringMVC在项目初始化时,会去扫描系统中的JAR包,然后根据扫描到的JAR包设置默认的转换类型,大概的扫描过程是:
1)检查系统中是否存在jackson-xml的JAR包,如果存在,就将数据转换类型列表中设置XML类型,以及其对应的转换器
2)检查系统中是否存在jackson-json的JAR包,如果存在,就在数据转换类型列表中设置JSON类型,以及其对应的转换器
因为是先检测的XML,因此XML排在JSON前面,如果系统两者的JAR包都存在,那么默认情况下数据会被转换成XML格式。
设置json数据,
@RequestMapping(value="/xml", produces={"application/json; charset=UTF-8"})
需要导入jackson的三个核心包:
jackson-annotations-2.8.5.jar
jackson-core-2.8.5.jar
jackson-databind-2.8.5.jar
设置XML数据
@RequestMapping(value="/xml", produces={"application/xml; charset=UTF-8"})
需要导入的包:
jackson-dataformat-xml-2.8.5.jar
但还需依赖于:
jackson-annotations-2.8.5.jar
jackson-core-2.8.5.jar
jackson-databind-2.8.5.jar
jackson-module-jaxb-annotations-2.8.5.jar
stax2-api-3.1.4.jar
woodstox-core-5.0.3.jar
前面说过如果同时有XML和JSON的JAR包的话,默认XML的优先级会高一些,这里可以进行一下测试,看看如果不设置 produces,获取的数据是JSON还是XML。