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

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


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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419139.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS -服务卡片

服务卡片提供了一种界面展示形式,可以将应用的重要信息或操作前置到服务卡片以达到服务直达、减少跳转层级的体验效果。有些类似于创建了一种 “快键方式”,比如下面的卡片流程图: 添加基础卡片 右键入口模块按照图示新增卡片 ArkTS卡片创建…

4-1.Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo Camera.CameraInfo 是用于获取设备上摄像头信息的一个类,它提供摄像头的各种详细信息,例如,摄像头的方向、是否支持闪光灯等,以下是它的常用属性 static int CAMERA_FACING_BACK:表示设备的后置…

【生日视频制作】F900xr宝马摩托车提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程F900xr宝马摩托车提车交车仪式AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓: 怎么如何做的【生日视频制作】F900xr宝马摩托车提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&a…

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人…

UNITY UI简易反向遮罩

附带示例资源文件:https://download.csdn.net/download/qq_55895529/89726994?spm1001.2014.3001.5503 大致效果: 实现思路:通过ui shader的模板测试功能实现 通过让想要被突出显示的物体优先渲染并写入模板值,而后再让黑色遮罩渲染并判断模板值进行渲…

龙芯+FreeRTOS+LVGL实战笔记(新)——06添加二级按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以…

揭秘 AMD GPU 上 PyTorch Profiler 的性能洞察

Unveiling performance insights with PyTorch Profiler on an AMD GPU — ROCm Blogs 2024年5月29日,作者:Phillip Dang。 在机器学习领域,优化性能通常和改进模型架构一样重要。在本文中,我们将深入探讨 PyTorch Profiler&#…

【人工智能学习笔记】2_数据处理基础

数据的概述 数据(Data)的定义 用于表示客观事物的未经加工的原始素材不仅指狭义上的数字,也只具有一定意义的文字、字母、数字符号的组合客观事物的属性、数量、位置及其相互关系的抽象表示 在计算机科学与技术领域中,数据是指…

vite+vue3+typescript+elementPlus前端实现电子证书查询系统

实现背景:之前电子证书的实现是后端实现的,主要采用GD库技术,在底图上添加文字水印和图片水印实现的。这里采用前端技术实现电子证书的呈现以及点击证书下载,优点是:后端给前端传递的是一组数据,不需要传证…

从零开始写论文:如何借助ChatGPT生成完美摘要?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 在写论文的过程中,摘要是一个非常重要的部分,它能够帮助读者快速理解论文的核心内容,决定是否进一步阅读全文。但是许多学生在写摘要的时候常常感到困惑,不知…

基于Java的宿舍报修管理系统的设计与实现(论文+源码)_kaic

基于Java的宿舍报修管理系统的设计与实现(论文源码)_kaic 摘  要 随着教育改革‎‏的不断‎‏深入,‎‏学校宿‎‏舍的管‎‏理体系‎‏也在不‎‏断地完‎‏善,校园后勤服务是学校管理的重要工作,学校提供优秀的后勤服务,能提…

自制游戏手柄--电位器的使用

在前面的讨论中,我们考虑了使用陀螺仪来获取手柄的运动情况来进行瞄准, 自制实战吃鸡手柄原理-CSDN博客 也可以使用图像识别来实现,这里我们再考虑下使用电位器来获取运动状态,一个电位器可以获取到一个平面上的旋转情况&#x…

C++——类与对象(二)

目录 引言 类的默认成员函数 构造函数 1.构造函数的概念 2.注意事项 初始化列表 1.初始化列表的概念 2.注意事项 析构函数 1.析构函数的概念 2.注意事项 拷贝构造函数 1.拷贝构造函数的概念 2.注意事项 运算符重载 1.运算符重载的概念 2.注意事项 赋值运算符…

开源网安引领AIGC+开发安全,智能防护铸就软件安全新高度

近日,国内网络安全领域知名媒体数说安全正式发布了《2024年中国网络安全市场100强》和《2024年中国网络安全十大创新方向》。开源网安凭借在市场表现力、资源支持力以及产品在AI方向的创新力上的优秀表现成功入选百强榜单,并被评为“AIGC开发安全”典型厂…

Percona 开源监控方案 PMM 详解

文章目录 前言1. 安装部署1.1 Server 安装1.2 Client 安装 2. 监控数据库2.1 MySQL2.2 PostgreSQL 3. Dashboard 介绍总结 前言 Percona Monitoring and Management (PMM) 是 Percona 公司基于业界流行的组件 Prometheus 和 Grafana 设计开发的一体化数据库监控解决方案。本篇…

【H2O2|全栈】关于HTML(3)HTML基础(二)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类(二) 本文中的标签在什么位置使用? 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…

【数据结构】你知道什么是二叉树的顺序存储结构吗?

文章目录 前言1. 顺序结构2. 实现顺序结构二叉树2.1 堆的概念与结构2.2 堆的实现2.2.1 向上调整算法2.2.2 向下调整算法 3. 结语 前言 二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。本文将要介绍的是二叉树的顺序存储结构。 1. 顺序结构…

python安装以及访问openAI API

安装python 我是python小白,所以需要一步一步来,先安装。 一口吃不成胖子,记住。 从官网下载python,目前最新版本是3.12,但是据说稳定版3.11更好一点,所以,下载3.11,注意不要下载…

stm32的内部时钟源 | RC震荡电路

文章目录 前言学习了解 前言 了解到 内部高速RC振荡器(HSI)就是RC震荡器实现的,故想对RC震荡做些了解与分析。 学习了解 【不需要晶振,也可产生时钟脉冲!RC振荡器的工作原理,维恩电桥振荡器!…

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。