当前位置: 首页 > news >正文

【Java】ApiPost请求返回 `406` 状态码(jackson)

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类没有使用 gettersetter方法

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

  • 自动生成 gettersetter 方法:@Data 注解自动生成了所有属性的 gettersetter 方法。

  • 🌟 序列化和反序列化:使用 @Data 注解后,序列化库(如 Jackson 或 Gson)能够正确识别并处理这些方法。
    ⭐️ 注意是序列化库

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

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

在这里插入图片描述

4.3.2.3 结果

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

在这里插入图片描述


五、总结:

5.1 注意事项

5.1.1 序列化 gettersetter 方法无关

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

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

5.1.2 Jackson、Gson 等库需要注意

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

🌟 传输使用到了Jackson 库,所以gettersetter 方法尽量都要写出
在这里插入图片描述

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

例子如下:

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);  }  
}

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解决linux云服务器ping不通另一台linux云服务器的问题
  • IP 协议详解
  • flutter之常用数据类型
  • 力扣704:二分查找
  • Ruby 多线程
  • Django+Vue家居全屋定制系统的设计与实现
  • 某云彩SRM2.0任意文件下载漏洞
  • OpenGL知识点记录
  • 使用 GZCTF 结合 GitHub 仓库搭建独立容器与动态 Flag 的 CTF 靶场+基于 Docker 的 Web 出题与部署+容器权限控制
  • RabbitMQ 入门教程
  • 把时间当作朋友
  • Hive时间窗口函数保姆级教程(最全解析、应用和优化)(持续更新)
  • C语言学习笔记 Day16(C10文件管理--下)
  • 《机器学习》文本数据分析之关键词提取、TF-IDF、项目实现 <上>
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——10.继承
  • ES6核心特性
  • HTTP中GET与POST的区别 99%的错误认识
  • jquery ajax学习笔记
  • Js基础——数据类型之Null和Undefined
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • miaov-React 最佳入门
  • Python 基础起步 (十) 什么叫函数?
  • vue总结
  • 技术胖1-4季视频复习— (看视频笔记)
  • 学习ES6 变量的解构赋值
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #Z0458. 树的中心2
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (南京观海微电子)——COF介绍
  • (十三)Flink SQL
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net dataexcel winform控件 更新 日志
  • .net(C#)中String.Format如何使用
  • /usr/bin/env: node: No such file or directory
  • @AutoConfigurationPackage的使用
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [AAuto]给百宝箱增加娱乐功能
  • [APIO2015]巴厘岛的雕塑
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [cb]UIGrid+UIStretch的自适应
  • [CISCN2019 华东北赛区]Web2
  • [Deepin] 简单使用 RustDesk 实现远程访问Deepin
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [flask]http请求//获取请求体数据
  • [hive] 窗口函数 ROW_NUMBER()