Spring Controller 返回json格式406问题

 

今天在进行前后端分离,希望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.查询到结果

[     {         "id": 11,         "name": "XX1",         "password": "202cb962ac59075b964b07152d234b70",         "type": "普通管理员"     },     {         "id": 23,         "name": "rww",         "password": "398238",         "type": "超级管理员"     } ]

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。

在 Web 应用程序中,通常使用 Spring MVC 或 Spring Boot 等框架来开发 RESTful API,以提供 JSON 格式的数据。在 Spring MVC 中,可以使用 `@RestController` 注解来标记一个类,将其作为 RESTful API 的控制器,然后使用 `@RequestMapping` 或其他注解来定义不同的请求路径和 HTTP 方法。 以下是一个简单的示例,演示如何使用 Spring MVC 返回 JSON 数据: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<User> getUsers() { return userService.getUsers(); } @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } } ``` 在这个示例中,`UserController` 类被标记为 `@RestController`,表示它是一个 RESTful API 的控制器。`userService` 是一个用户服务类的实例,它被自动注入到控制器中。`getUsers` 方法使用 `@GetMapping("/users")` 注解来定义了 `/users` 路径和 HTTP GET 方法,它将返回一个包含所有用户的 JSON 数组。`getUserById` 方法使用 `@GetMapping("/users/{id}")` 注解来定义了带有路径变量的路径和 HTTP GET 方法,它将返回具有指定 ID 的用户的 JSON 对象。 当客户端发送 GET 请求到 `/users` 路径时,服务器将返回一个 JSON 数组,其中包含所有用户的信息。例如: ```json [ { "id": 1, "name": "Alice", "age": 25 }, { "id": 2, "name": "Bob", "age": 30 }, { "id": 3, "name": "Charlie", "age": 35 } ] ``` 当客户端发送 GET 请求到 `/users/1` 路径时,服务器将返回一个具有 ID 为 1 的用户的 JSON 对象。例如: ```json { "id": 1, "name": "Alice", "age": 25 } ``` 以上示例中使用了 Spring Boot,但是同样的代码也适用于 Spring MVC。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值