Java ApiPost請求返回406狀態(tài)碼問題的解決方案
一、前言
- 使用ApiPost請求的時候遇到問題記錄
- 這是記錄思考過程,看結(jié)果直接看
5.1.2小節(jié)
二、學(xué)習(xí)內(nèi)容:
- 序列化與反序列化
- 數(shù)據(jù)傳輸
三、問題描述
3.1 問題截圖
- 前端請求后返回的是
406
狀態(tài)
3.2 錯誤簡介
3.2.1 HTTP狀態(tài)碼 406 Not Acceptable
- 客戶端發(fā)送一個請求,并且在請求頭中指定了一個或多個可接受的內(nèi)容類型(通過 Accept 頭字段)
- ?? 而服務(wù)器無法提供任何這些類型的內(nèi)容時,就會返回這個狀態(tài)碼。
3.2.2 序列化和反序列化
Java中的序列化和反序列化是將對象轉(zhuǎn)換為字節(jié)流和將字節(jié)流轉(zhuǎn)換回對象的過程。
- 序列化使對象能夠被存儲到文件、發(fā)送到網(wǎng)絡(luò)中或進行其他操作
- 反序列化則是將這些字節(jié)流恢復(fù)為原來的對象。
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中,要使一個對象可被序列化,必須實現(xiàn)
java.io.Serializable
接口。這個接口是一個標(biāo)記接口,不需要實現(xiàn)任何方法
如圖代碼生成器生成的實體類就有
4.2 解決過程
4.2.1 查找原因
查找406會出現(xiàn)的問題
客戶端請求頭設(shè)置問題
- 問題核心:客戶端請求頭中的 Accept 字段指定的內(nèi)容類型,服務(wù)器無法提供。
服務(wù)器端配置問題
- 問題核心:服務(wù)器沒有配置正確的消息轉(zhuǎn)換器來支持客戶端請求的內(nèi)容類型。
不兼容的內(nèi)容類型
- 問題核心:客戶端和服務(wù)器之間存在內(nèi)容類型不兼容的問題。 4.2.2 根據(jù)原因檢查代碼錯誤
觀察后發(fā)現(xiàn)主要是類型的錯誤,不管是客戶端還是服務(wù)器肯定哪里類型轉(zhuǎn)換出了問題
- 可是這些配置一般
Spring
框架都已經(jīng)配置好了,平時也沒遇到這個問題,代碼也是自動生成的 - 所以肯定是自己寫的返回的類型少了什么導(dǎo)致無法轉(zhuǎn)換
4.2.3 定位成功
Result類沒有使用 getter 和 setter方法
為什么 @Data
注解可以解決問題
- 自動生成
getter
和setter
方法:@Data
注解自動生成了所有屬性的getter
和setter
方法。 - 序列化和反序列化:使用
@Data
注解后,序列化庫(如 Jackson 或 Gson)能夠正確識別并處理這些方法。注意是序列化庫
如圖注解加上或者自己寫 getter
和 setter
方法即可
當(dāng)時只想著后端代碼能用即可,沒注意傳輸?shù)膯栴}
4.3.2.3 結(jié)果
自定義的返回類能正常傳輸
五、總結(jié):
5.1 注意事項
5.1.1 序列化 getter 和 setter 方法無關(guān)
無論是否有 getter 和 setter 方法,只要類實現(xiàn)了 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(); // 創(chuàng)建對象 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); } }
聲明:如本內(nèi)容中存在錯誤或不準(zhǔn)確之處,歡迎指正。
以上就是Java ApiPost請求返回406狀態(tài)碼問題的解決方案的詳細內(nèi)容,更多關(guān)于Java ApiPost請求返回406的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean
這篇文章主要介紹了Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean,每個用戶有自己特有的一個實例,在用戶的生存期內(nèi),bean保持了用戶的信息,下面來了解有狀態(tài)和無狀態(tài)的區(qū)別吧2022-01-01Java關(guān)鍵字final、static使用總結(jié)
final方法不能被子類的方法覆蓋,但可以被繼承。用static修飾的代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(JVM)加載類時,就會執(zhí)行該代碼塊,下面通過本文給大家分享Java關(guān)鍵字final、static使用總結(jié),感興趣的朋友一起看看吧2017-07-07利用SpringMVC接收復(fù)雜對象和多個文件(前端使用JQuery)
這篇文章主要介紹了利用SpringMVC接收復(fù)雜對象和多個文件(前端使用JQuery),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-105分鐘搭建SpringCloud Eureka服務(wù)注冊中心的實現(xiàn)
這篇文章主要介紹了5分鐘搭建SpringCloud Eureka服務(wù)注冊中心的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03