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

2024-09-04 23:12

本文主要是介绍【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);  }  
}

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


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

在这里插入图片描述

这篇关于【Java】ApiPost请求返回 `406` 状态码(jackson)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

Jvm sandbox mock机制的实践过程

《Jvmsandboxmock机制的实践过程》:本文主要介绍Jvmsandboxmock机制的实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景二、定义一个损坏的钟1、 Springboot工程中创建一个Clock类2、 添加一个Controller

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请