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