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

news2024/9/24 15:23:49

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.coloradmin.cn/o/2105190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yaml文件查看模型的架构

最近在看hrnet模型代码,想查看hrnet的模型架构,输出一下,但是模型参数需要cfg,我就想着怎么把yaml文件导进来然后打印模型呢,直接chat就可以了,下面解释一下每一部分,非常的好理解 yaml文件格式…

传神论文中心|第24期人工智能领域论文推荐

在人工智能领域的快速发展中,我们不断看到令人振奋的技术进步和创新。近期,开放传神(OpenCSG)传神社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自…

ChatGPT 3.5/4.0使用手册:解锁人工智能的无限潜能

1. 引言 在人工智能的浪潮中,ChatGPT以其卓越的语言理解和生成能力,成为了一个革命性的工具。它不仅仅是一个聊天机器人,更是一个能够协助我们日常工作、学习和创造的智能伙伴。随着ChatGPT 3.5和4.0版本的推出,其功能和应用范围…

3个免费好用的网站,可以转换PDF,提取MP3

今天分享的三个网站,分别用于文件转换PDF,QMC转MP3格式和配色网站。 TOPDF 这个网站是一个在线PDF转换工具,可以快速将文本文件、演示文稿、电子表格和图片转换为PDF格式。它支持多种文件格式,如AZW3、BMP、CHM、CSV、DjVu、DOC、…

秋招突击——算法练习——8/30、9/4——技巧题练习——复习{}——新作{只出现一次的数字、多数元素、颜色分类、下一个排列、寻找重复数}

文章目录 引言复习新作136、只出现一次的数字个人实现 169、多数元素个人实现 75、颜色分类个人实现参考实现 31、下一个排列个人实现参考实现 287寻找重复数个人实现参考实现 总结 引言 手撕的代码大部分都是出自于这里,还是要继续加强,把剩下一些零碎…

10分钟学会Jmeter的用法

一提到接口测试,通常大家会有这样的疑问:前端测试不是已经覆盖到各种业务逻辑了吗?为什么还要做接口测试,接口测试和前端测试是不是重复了?对于这个问题,可以从下面几个方面来解释: 什么是接口…

Ubuntu共享文件夹的设置

ubuntu的操作路径时:/mnt/hgfs/51C_share

Mongodb 4.2.25 安装教程

一、上传部署包 1.1上传mongodb包进入/usr/local目录,将mongodb-linux-x86_64-rhel70-4.2.25.tgz包传到该目录下。 cd /usr/local 二、安装 2.1解压 tar zxvf mongodb-linux-x86_64-rhel70-4.2.25.tgz 2.2修改名称 mv mongodb-linux-x86_64-rhel70-4.2.25/ mong…

《OpenCV计算机视觉》—— 模板匹配

文章目录 一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle() 三、代码实现 一、模板匹配简单介绍 在Python中,模板匹配是一种在图像中查找与给定模…

记录一下blender烘焙贴图黑边的一个坑

首先是拆UV这里 margin 0.1 better share better 这个也大一点好了 这样烘焙的猴头就是正常的 这里的坑点是 降噪!!烘焙如果开启降噪 如果关闭下面那一个 会好一点,都关闭了,才是最上面的效果

2024全国大学生数学建模国赛评审细则

2024全国大学生数学建模国赛评审细则 —参考2023年全国大学生数学建模竞赛C题评阅细则 评分体系阅览 —分值结果仅供参考 80分:稳国一; 65分:达国奖门槛(70分更为稳妥); 60至50分:有望获省…

整形提升-C语言

整型提升的原则:当一个小字节数,向大字节数转换时,有符号补0或1,无符号补0; 为什么会发生测试结果呢,让我们来看一下 在64位的环境中char是1个字节8位 char a1; 1000 0001 原码 整形提升 111…

网恋照妖镜源码搭建教程

文章目录 前言创建网站1.打开网站设置 配置ssl2.要打开强制HTTPS,用宝塔免费的ssl证书即可,也可以使用其他证书,必须是与域名匹配的3.上传文件至根目录进行解压4.解压后,修改文件 sc.php 里面的内容5.其余探索 前言 前俩年很火的…

ComfyUI中IC-Light节点的Detail Transfer节点参数测试

🎆背景 ic-light是一个能重绘画面光影的节点,但是在重绘的过程中,难免会将图像本身的细节进行重绘,尤其是在电商的场景中,文字和商品的细节很多时候会被重绘的乱七八糟。 针对这种情况,Comfyui-IC-Light节…

Elasticsearch的Restful风格API

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 1、Restful及JSON格式 RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用 XML 格式定义或 JSON 格式定义。R…

串行总线舵机

项目需求: 直接旋转:总体旋转角度方向 微调:步进模式/闭环电机模式 需要考虑受力之类的吗 初选方案: 只改写底层,然后引入官方驱动,通过各种函数 5、舵机如何实现在机械臂夹具中使用。 仅限夹取相同物…

开发台球助教小程序前景分析

开发台球助教小程序的前景分析可从以下维度展开探讨: 市场需求的增长 台球作为一项受欢迎的休闲运动,其爱好者群体正在扩大。随着大众对这项运动兴趣的增加,寻求系统化培训的需求也愈发明显。台球助教小程序正好填补了这一市场空白&#xf…

学习大数据DAY49 考后练习题

前几天在考帆软,考完后还有周末大礼包。 Oracle 上机练习 --第一题 create table 客户交易情况 ( 客户号 varchar2(5), 交易时间 varchar2(20),交易金额 number(5) ); --表中内容手动录入 select dense_rank()over(order by ascii(客户号)) as 序号 1,客户号, den…

MySQL插入更新死锁问题解析

文章目录 1 问题背景2 线上问题2.1 线上异常日志2.2 数据准备2.3 问题复现2.3.1 执行流程2.3.2 死锁排查 2.3.3 死锁日志分析2.3.3.1 事务A23087信息2.3.3.2 事务23087持有锁2.3.3.3 事务23087等待锁2.3.3.4 事务23088信息2.3.3.5 事务23088持有锁2.3.3.6 事务23088等待锁 3 分…

python进阶篇-day05-网络编程(TCP)与进程

day05网络编程 一. 网编三要素 ip 概述 设备(电脑, 手机, IPad, 耳机...)在网络中的唯一标识. 分类 按照 代数 划分: IPv4: 4字节, 十进制来表示, 例如: 192.168.13.157 IPv6: 8字节, 十六进制来表示, 理论上来讲, 可以让地球上的每一粒沙子都有自己的IP. Ipv4 常用类别划…