Java系列文章目录
补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史
文章目录
- Java系列文章目录
- 一、前言
- 二、学习内容:
- 三、问题描述
- 3.1 问题截图
- 3.2 错误简介
- 3.2.1 HTTP状态码 `406 Not Acceptable`
- 3.2.2 序列化和反序列化
- 3.3 后端问题位置
- 四、解决方案:
- 4.1 认识问题
- 4.2 解决过程
- 4.2.1 查找原因
- 4.2.2 根据原因检查代码错误
- 4.2.3 定位成功
- 4.3.2.3 结果
- 五、总结:
- 5.1 注意事项
- 5.1.1 序列化 `getter` 和 `setter` 方法无关
- 5.1.2 Jackson、Gson 等库需要注意
一、前言
- 使用ApiPost请求的时候遇到问题记录
- 这是记录思考过程,看结果直接看
5.1.2小节
二、学习内容:
- 序列化与反序列化
- 数据传输
三、问题描述
3.1 问题截图
- 前端请求后返回的是
406
状态
3.2 错误简介
3.2.1 HTTP状态码 406 Not Acceptable
- 客户端发送一个请求,并且在请求头中指定了一个或多个可接受的内容类型(通过 Accept 头字段)
- 🌟 而服务器无法提供任何这些类型的内容时,就会返回这个状态码。
3.2.2 序列化和反序列化
Java中的序列化和反序列化是将对象转换为字节流和将字节流转换回对象的过程。
- 序列化使对象能够被存储到文件、发送到网络中或进行其他操作
- 反序列化则是将这些字节流恢复为原来的对象。
3.3 后端问题位置
后台没有明显报错
@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
注解可以解决问题
-
自动生成
getter
和setter
方法:@Data
注解自动生成了所有属性的getter
和setter
方法。 -
🌟 序列化和反序列化:使用
@Data
注解后,序列化库(如 Jackson 或 Gson)能够正确识别并处理这些方法。
⭐️注意是序列化库
如图注解加上或者自己写 getter
和 setter
方法即可
当时只想着后端代码能用即可,没注意传输的问题
4.3.2.3 结果
自定义的返回类能正常传输
五、总结:
5.1 注意事项
5.1.1 序列化 getter
和 setter
方法无关
无论是否有
getter
和setter
方法,只要类实现了Serializable
接口,实例就能够被序列化和反序列化。
- 如果你不使用序列化库,或者你自定义了序列化和反序列化的方法,那么不使用
getter
和setter
也是可以的。
5.1.2 Jackson、Gson 等库需要注意
本次错误主要原因:
getter
和setter
方法没写,序列化的时候可能访问不到对象
🌟 传输使用到了Jackson
库,所以getter
和 setter
方法尽量都要写出
- 与序列化库的兼容:如 Jackson 和 Gson 等库在处理 Java 对象时,通常会使用
getter
和setter
方法来访问字段的值。如果没有这些方法,这些库可能无法正确识别或处理一些字段。
例子如下:
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);
}
}
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。