IT俱乐部 Java Java ApiPost请求返回406状态码问题的解决方案

Java ApiPost请求返回406状态码问题的解决方案

一、前言

  • 使用ApiPost请求的时候遇到问题记录
  • 这是记录思考过程,看结果直接看5.1.2小节

二、学习内容:

  • 序列化与反序列化
  • 数据传输

三、问题描述

3.1 问题截图

  • 前端请求后返回的是406状态

3.2 错误简介

3.2.1 HTTP状态码 406 Not Acceptable

  • 客户端发送一个请求,并且在请求头中指定了一个或多个可接受的内容类型(通过 Accept 头字段)
  • 🌟服务器无法提供任何这些类型的内容时,就会返回这个状态码。

3.2.2 序列化和反序列化

Java中的序列化和反序列化是将对象转换为字节流和将字节流转换回对象的过程

  • 序列化使对象能够被存储到文件、发送到网络中或进行其他操作
  • 反序列化则是将这些字节流恢复为原来的对象。

3.3 后端问题位置

后台没有明显报错

1
2
3
4
5
6
@PostMapping("login")
public Result login(@RequestBody AdminLoginDTO adminLoginDTO) {
    log.info("adminLoginDTO:{}", adminLoginDTO);
    String token = adminService.login(adminLoginDTO);
    return Result.success(token);
}

四、解决方案:

4.1 认识问题

  • 在Java中,要使一个对象可被序列化,必须实现 java.io.Serializable 接口。这个接口是一个标记接口,不需要实现任何方法

如图代码生成器生成的实体类就有

4.2 解决过程

4.2.1 查找原因

查找406会出现的问题

客户端请求头设置问题

  • 问题核心:客户端请求头中的 Accept 字段指定的内容类型,服务器无法提供。

服务器端配置问题

  • 问题核心:服务器没有配置正确的消息转换器来支持客户端请求的内容类型。

不兼容的内容类型

  • 问题核心:客户端和服务器之间存在内容类型不兼容的问题。 4.2.2 根据原因检查代码错误

观察后发现主要是类型的错误,不管是客户端还是服务器肯定哪里类型转换出了问题

  • 可是这些配置一般Spring框架都已经配置好了,平时也没遇到这个问题,代码也是自动生成的
  • 所以肯定是自己写的返回的类型少了什么导致无法转换

4.2.3 定位成功

Result类没有使用 getter 和 setter方法

为什么 @Data 注解可以解决问题

  • 自动生成 gettersetter 方法:@Data 注解自动生成了所有属性的 gettersetter 方法。
  • 序列化和反序列化:使用 @Data 注解后,序列化库(如 Jackson 或 Gson)能够正确识别并处理这些方法。
    注意是序列化库

如图注解加上或者自己写 gettersetter 方法即可

当时只想着后端代码能用即可,没注意传输的问题

4.3.2.3 结果

自定义的返回类能正常传输

五、总结:

5.1 注意事项

5.1.1 序列化 getter 和 setter 方法无关

无论是否有 getter 和 setter 方法,只要类实现了 Serializable 接口,实例就能够被序列化和反序列化。

  • 如果你不使用序列化库,或者你自定义了序列化和反序列化的方法,那么不使用 getter 和 setter 也是可以的

5.1.2 Jackson、Gson 等库需要注意

本次错误主要原因: getter 和 setter 方法没写,序列化的时候可能访问不到对象

传输使用到了Jackson 库,所以gettersetter 方法尽量都要写出

  • 与序列化库的兼容:如 Jackson 和 Gson 等库在处理 Java 对象时,通常会使用 getter 和 setter 方法来访问字段的值。如果没有这些方法,这些库可能无法正确识别或处理一些字段。

例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import com.fasterxml.jackson.databind.ObjectMapper; 
 
public class Main { 
    public static void main(String[] args) throws Exception { 
        ObjectMapper objectMapper = new ObjectMapper(); 
         
        // 创建对象 
        Person person = new Person(); 
        person.setName("Alice"); 
        person.setAge(30); 
         
        // 序列化 
        String jsonString = objectMapper.writeValueAsString(person); 
        System.out.println("Serialized JSON: " + jsonString); 
         
        // 反序列化 
        Person deserializedPerson = objectMapper.readValue(jsonString, Person.class); 
        System.out.println("Deserialized Person: " + deserializedPerson); 
    
}

声明:如本内容中存在错误或不准确之处,欢迎指正。

以上就是Java ApiPost请求返回406状态码问题的解决方案的详细内容,更多关于Java ApiPost请求返回406的资料请关注IT俱乐部其它相关文章!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/15221.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部