一文帶你揭秘SpringMvc參數(shù)值映射
前言
我們平時開發(fā)的接口參數(shù)類型,有簡單類型例如Long,String,也有JSON格式的,還有自定義對象類型。想一想,如果讓我們自己開發(fā)一套參數(shù)值映射代碼,還是挺復雜,一是需要處理的參數(shù)類型比較多,還有就是會有一些復雜的場景,比如對象的多層嵌套。今天我將從處理過程的抽象,常見傳參類型兩個大的方面講解參數(shù)值映射。
一.處理過程的抽象
說到參數(shù)映射處理的抽象,就不得不提到
HandlerMethodArgumentResolver接口:
接口有兩個方法: 1.boolean supportsParameter(MethodParameter parameter); 用來判斷實現(xiàn)類是否可以處理該類型的參數(shù)
2.Object resolveArgument(...) 經(jīng)過讀取參數(shù)值,類型轉換,值映射等處理,返回參數(shù) 所有參數(shù)值處理類都需要實現(xiàn)此接口,遵從了設計模式中的模版模式。 處理過程通俗地說就是:從一堆螺絲刀里面,挨個判斷,這把螺絲刀是否可以擰這個螺絲,如果型號剛好匹配,那就拿著這個螺絲刀去擰螺絲。 SpringMvc還給這些個螺絲刀,找了個工具箱,來存放他們。這個工具箱名字叫做: HandlerMethodArgumentResolverComposite,composite是混合,合成的意思。 HandlerMethodArgumentResolverComposite將所有的參數(shù)值處理類整合在一起。
二.常見傳參類型
1.自定義對象類型
示例:
@RequestMapping("/test1")
public String methodForObjectParam (FamilyDTO familyDTO){
System.out.println("familyDTO:"+JSON.toJSONString(familyDTO));
return "";
}對應的參數(shù)值處理類為
ServletModelAttributeMethodProcessor
參數(shù)值映射的過程如下:

2.@RequestParam注解參數(shù)
示例:
@RequestMapping("/test3")
public String methodForRequestParam (@RequestParam Integer param){
System.out.println("RequestParam:"+JSON.toJSONString(param));
return "";
}對應的參數(shù)值處理類為RequestParamMethodArgumentResolver
參數(shù)映射的步驟如下:
1.1從request中獲取參數(shù)名對應的值
1.2參數(shù)值類型轉換,從request中獲取的參數(shù)值為String,需要轉化為對應Integer等類型。 spring-core提供了超級多的類型轉換工具,我截取了部分類:

Spring的強大不僅僅在它的設計思想,對各種復雜情況的支持,還有強大的代碼底層。
3.@RequestBody注解參數(shù)
示例:
@RequestMapping("/test6")
public String methodForRequestBody (@RequestBody FamilyDTO familyDTO){
System.out.println("methodForNormalParam:"+JSON.toJSONString(familyDTO));
return "";
}對應的參數(shù)值處理類為:RequestResponseBodyMethodProcessor
參數(shù)映射的步驟如下:
1.1將body反序列化為對象
1.2如果類型為Optional,創(chuàng)建Optional類型對象
4.簡單類型,無@RequestParam注解
示例:
@RequestMapping("/test5")
public String methodForNormalParam (Integer param){
System.out.println("methodForNormalParam:"+JSON.toJSONString(param));
return "";
}對于參數(shù)param,和帶有@RequestParam注解的參數(shù)一樣,使用 RequestParamMethodArgumentResolver類進行參數(shù)值映射。
SpringMvc接口調用的核心方法invokeForRequest在InvocableHandlerMethod類中,大家有興趣,可以自己閱讀下源碼:
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
//從request中讀取,轉化參數(shù)值
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
if (logger.isTraceEnabled()) {
logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
"' with arguments " + Arrays.toString(args));
}
//方法的調用
Object returnValue = doInvoke(args);
if (logger.isTraceEnabled()) {
logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
"] returned [" + returnValue + "]");
}
return returnValue;
}總結
到此這篇關于SpringMvc參數(shù)值映射的文章就介紹到這了,更多相關SpringMvc參數(shù)值映射內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java socket大數(shù)據(jù)傳輸丟失問題及解決
這篇文章主要介紹了java socket大數(shù)據(jù)傳輸丟失問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查
這篇文章主要為大家詳細介紹了使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
Spring Cloud Consul的服務注冊與發(fā)現(xiàn)
這篇文章主要介紹了Spring Cloud Consul服務注冊與發(fā)現(xiàn)的實現(xiàn)方法,幫助大家更好的理解和學習使用spring框架,感興趣的朋友可以了解下2021-02-02

