新聞中心
環(huán)境:SpringBoot2.7.12

樂東黎族網站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、成都響應式網站建設等網站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)建站于2013年創(chuàng)立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創(chuàng)新互聯(lián)建站。
1. 簡介
在Spring MVC中,HttpMessageConverter主要用于將HTTP請求的輸入內容轉換為指定的Java對象,以及將Java對象轉換為HTTP響應的輸出內容。這種靈活的消息轉換機制就是利用HttpMessageConverter來實現的。
Spring MVC提供了多個默認的HttpMessageConverter實現,包括處理JSON、XML、文本等格式的Converter。另外,我們也可以自定義HttpMessageConverter來處理其他格式的數據。
Spring MVC提供了兩個注解:@RequestBody和@ResponseBody,分別用于完成請求報文到對象和對象到響應報文的轉換。
然而,有時候默認的HttpMessageConverter無法滿足特定的需求,例如,當我們需要處理的數據格式沒有默認的Converter時,或者我們需要對現有的Converter進行擴展時,就需要自定義HttpMessageConverter。
自定義HttpMessageConverter可以讓我們更加靈活地控制數據轉換的過程,例如我們可以自定義轉換規(guī)則、異常處理等。
接下來我們通過一個實例講解如何自定義HttpMessageConverter。
需求
接口請求數據格式:
xxx|yyy|zzz|...
接口返回JSON數據格式
{
"xxx": xxx,
"yyy": yyy,
"zzz": zzz,
...
}
其實就上面的數據格式,我們完全可以不用自定義HttpMessageConverter也是完全可以實現的。我們這里主要就是教大家如何在特殊的需求下實現特定的數據轉換處理。
2. 實戰(zhàn)案例
自定義HttpMessageConverter轉換器
public class PackHttpMessageConverter implements HttpMessageConverter
將PackHttpMessageConverter注冊到容器中
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List> converters) {
converters.add(new PackHttpMessageConverter()) ;
}
}
到這里自定義HttpMessageConverter及注冊到容器中就全部完成了,開發(fā)還是比較簡單,接下來做測試
接口
// 方法非常簡單還是用的那些常用的類,@RequestBody接收請求body中的內容
@PostMapping("/i")
public Object i(@RequestBody Users user) {
System.out.println(handlerAdapter) ;
return user ;
}
通過Postman測試接口
設置請求的header
圖片
圖片
似乎沒有任何的問題,其實你只要在寫的方法中打印下日志,或者調試下,你會發(fā)現你的write方法根本就沒有被調用,也就是說寫數據并沒有使用到我們自定義的實現,這是因為有優(yōu)先級比我們自定義的轉換器高,所以要想讓寫消息也調用自定義的。我們需要如下修改注冊方式:
public void configureMessageConverters(List> converters) {
converters.add(0, new PackHttpMessageConverter()) ;
}
這樣我們自定義的轉換器就排到了第一的位置,這樣就會調用我們自定義的write方法。
以上就是自定義HttpMessageConverter全部內容。
3. 實現原理
請求參數由于添加了@RequestBody,所以方法的參數解析器使用的是RequestResponseBodyMethodProcessor。
public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {
protected Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter,
Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {
// ...
// 讀取請求數據;調用父類方法
Object arg = readWithMessageConverters(inputMessage, parameter, paramType);
// ...
}
}
AbstractMessageConverterMethodArgumentResolver
public abstract class AbstractMessageConverterMethodArgumentResolver {
protected Object readWithMessageConverters(...) {
// ...
// 遍歷所有的消息轉換器
for (HttpMessageConverter> converter : this.messageConverters) {
Class> converterType = (Class>) converter.getClass();
GenericHttpMessageConverter> genericConverter = (converter instanceof GenericHttpMessageConverter ? (GenericHttpMessageConverter>) converter : null);
// 判斷當前轉換器是否讀,也就上面我們自定義中實現的canRead方法
if (genericConverter != null ? genericConverter.canRead(targetType, contextClass, contentType) :
(targetClass != null && converter.canRead(targetClass, contentType))) {
if (message.hasBody()) {
HttpInputMessage msgToUse = getAdvice().beforeBodyRead(message, parameter, targetType, converterType);
// 讀取具體的數據內容
body = (genericConverter != null ? genericConverter.read(targetType, contextClass, msgToUse) : ((HttpMessageConverter) converter).read(targetClass, msgToUse));
body = getAdvice().afterBodyRead(body, msgToUse, parameter, targetType, converterType);
}
else {
body = getAdvice().handleEmptyBody(null, message, parameter, targetType, converterType);
}
break;
}
}
}
}
原理也比較的簡單。
自定義HttpMessageConverter是Spring MVC中一個強大的工具,它可以幫助開發(fā)者更加靈活地控制數據轉換的過程,滿足特定的需求。
本文題目:帶你玩轉SpringMVC自定義HTTP請求響應數據轉換
標題鏈接:http://m.fisionsoft.com.cn/article/dpshjsd.html


咨詢
建站咨詢
