您好,登錄后才能下訂單哦!
今天小編給大家分享一下SpringMVC HttpMessageConverter消息轉換器怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
Spring MVC 為開發者提供了方便的開發方式和豐富的功能。其中,HttpMessageConverter 是Spring MVC中非常重要的一個組件,它負責將客戶端提交的請求數據(如JSON、XML等)轉換為Java對象,同時也負責將 Java 對象轉換為客戶端需要的數據格式。
在 Spring MVC 中,客戶端通過發送請求,向服務器端請求數據,服務器端接收到請求后需要將請求參數轉換為 Java 對象進行處理,這就需要使用 HttpMessageConverter,它主要負責將HTTP請求中的請求參數轉換為 Java 對象或將 Java 對象轉換為 HTTP 響應中的內容。
HttpMessageConverter 是一個接口,Spring MVC 中有很多實現類,用于處理不同的數據類型。常見的 HttpMessageConverter 實現類有:
ByteArrayHttpMessageConverter:用于處理字節數組類型的數據。
StringHttpMessageConverter:用于處理字符串類型的數據。
FormHttpMessageConverter:用于處理表單類型的數據。
MappingJackson2HttpMessageConverter:用于處理JSON類型的數據。
Jaxb2RootElementHttpMessageConverter:用于處理XML類型的數據。
HttpMessageConverter 接口定義了兩個方法:canRead() 和 canWrite(),分別用于判斷當前的 HttpMessageConverter 是否可以讀取或寫入指定的數據類型。
如果 canRead() 方法返回 true,那么當前的 HttpMessageConverter 就可以將 HTTP 請求中的請求參數轉換為 Java 對象;
如果 canWrite() 方法返回 true,那么當前的 HttpMessageConverter 就可以將Java對象轉換為 HTTP 響應中的內容。
下面以 MappingJackson2HttpMessageConverter 為例,講解 HttpMessageConverter 的源碼實現。
MappingJackson2HttpMessageConverter 是一個用于處理 JSON 類型數據的 HttpMessageConverter 實現類。它繼承了 AbstractJackson2HttpMessageConverter 類,并實現了 HttpMessageConverter 接口。
@Override public boolean canRead(Class<?> clazz, @Nullable MediaType mediaType) { JavaType javaType = getJavaType(clazz, null); return (this.objectMapper.canDeserialize(javaType) && canRead(mediaType)); }
方法首先調用了 getJavaType() 方法獲取 JavaType 對象
然后判斷當前的 ObjectMapper 是否可以反序列化 JavaType 對象。
如果當前的 HttpMessageConverter 可以反序列化 JavaType 對象并且當前的 MediaType 可以被處理,那么就返回 true,否則返回 false。
@Override public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) { return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType)); }
方法首先判斷當前的 ObjectMapper 是否可以序列化指定的 Java 對象
如果可以序列化并且當前的 MediaType 可以被處理,那么就返回 true,否則返回 false。
@Override public T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException { JavaType javaType = getJavaType(clazz, null); try { return this.objectMapper.readValue(inputMessage.getBody(), javaType); } catch (JsonProcessingException ex) { throw new HttpMessageNotReadableException("JSON parse error: " + ex.getMessage(), ex, inputMessage); } }
方法首先調用 getJavaType() 方法獲取 JavaType 對象
然后通過 ObjectMapper 的 readValue() 方法將HTTP請求中的請求參數轉換為 Java 對象。
如果在轉換的過程中出現了異常,那么就拋出 HttpMessageNotReadableException 異常。
@Override protected void writeInternal(T t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { try { JsonEncoding encoding = getJsonEncoding(outputMessage.getHeaders().getContentType()); JsonGenerator jsonGenerator = this.objectMapper.getFactory().createGenerator(outputMessage.getBody(), encoding); writePrefix(jsonGenerator, t); this.objectMapper.writeValue(jsonGenerator, t); writeSuffix(jsonGenerator, t); jsonGenerator.flush(); } catch (JsonProcessingException ex) { throw new HttpMessageNotWritableException("Could not write JSON: " + ex.getMessage(), ex); } }
方法首先通過 getJsonEncoding() 方法獲取JSON編碼格式
然后通過 ObjectMapper 的 writeValue() 方法將 Java 對象轉換為 JSON 格式的字符串
并將結果輸出到 HTTP 響應中。如果在轉換的過程中出現了異常,那么就拋出 HttpMessageNotWritableException 異常。
大家是不是覺得與前面文章所講的 MethodArgumentResolver 很相似,都能夠將請求參數轉換為Java對象,但它們的作用和處理流程不同:
HttpMessageConverter 會在請求到達 Controller 方法之前進行處理,這意味著它只處理請求參數,而不管 Controller 方法的簽名和參數類型;
MethodArgumentResolver 會在 Controller 方法執行之前進行處理,它的作用是將請求參數按照 Controller 方法的參數順序進行解析,并將解析結果映射到 Controller 方法的參數上,然后再調用 Controller 方法
以上就是“SpringMVC HttpMessageConverter消息轉換器怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。