Java编程实现NBA赛事接口调用实例代码
359
2022-09-01
一文带你揭秘SpringMvc参数值映射
目录前言一.处理过程的抽象二.常见传参类型1.自定义对象类型2.@RequestParam注解参数3.@RequestBody注解参数4.简单类型,无@RequestParam注解总结
前言
我们平时开发的接口参数类型,有简单类型例如Long,String,也有jsON格式的,还有自定义对象类型。想一想,如果让我们自己开发一套参数值映射代码,还是挺复杂,一是需要处理的参数类型比较多,还有就是会有一些复杂的场景,比如对象的多层嵌套。今天我将从处理过程的抽象,常见传参类型两个大的方面讲解参数值映射。
一.处理过程的抽象
说到参数映射处理的抽象,就不得不提到
HandlerMethodArgumentResolver接口:
接口有两个方法: 1.boolean supportsParameter(MethodParameter parameter); 用来判断实现类是否可以处理该类型的参数
2.Object resolveArgument(...) 经过读取参数值,类型转换,值映射等处理,返回参数 所有参数值处理类都需要实现此接口,遵从了设计模式中的模版模式。 处理过程通俗地说就是:从一堆螺丝刀里面,挨个判断,这把螺丝刀是否可以拧这个螺丝,如果型号刚好匹配,那就拿着这个螺丝刀去拧螺丝。 SpringMvc还给这些个螺丝刀,找了个工具箱,来存放他们。这个工具箱名字叫做: HandlerMethodArgumentResolverComposite,composite是混合,合成的意思。 HandlerMethodArgumentResolverComposite将所有的参数值处理类整合在一起。
二.常见传参类型
1.自定义对象类型
示例:
@RequestMapping("/test1")
public String methodForObjectParam (FamilyDTO familyDTO){
System.out.println("familyDTO:"+JSON.toJSONString(familyDTO));
return "";
}
对应的参数值处理类为
ServletModelAttributeMethodProcessor
参数值映射的过程如下:
2.@RequestParam注解参数
示例:
@RequestMapping("/test3")
public String methodForRequestParam (@RequestParam Integer param){
System.out.println("RequestParam:"+JSON.toJSONString(param));
return "";
}
对应的参数值处理类为RequestParamMethodArgumentResolver
参数映射的步骤如下:
1.1从request中获取参数名对应的值
1.2参数值类型转换,从request中获取的参数值为String,需要转化为对应Integer等类型。 spring-core提供了超级多的类型转换工具,我截取了部分类:
Spring的强大不仅仅在它的axPON设计思想,对各种复杂情况的支持,还有强大的代码底层。
3.@RequestBody注解参数
示例:
@RequestMapping("/test6")
public String methodForRequestBody (@RequestBody FamilyDTO familyDTO){
System.out.println("methodForNormalParam:"+JSON.toJSONString(familyDTO));
return "";
}
对应的参数值处理类为:RequestResponseBodyMethodProcessor
参数映射的步骤如下:
1.1将body反序列化为对象
1.2如果类型为Optional,创建Optional类型对象
4.简单类型,无@RequestParam注解
示例:
@RequestMapping("/test5")
public String methodForNormalParam (Integer param){
System.out.println("methodForNormalParam:"+JSON.toJSONString(param));
return "";
}
对于参数param,和带有@RequestParam注解的参数一样,使用 RequestParamMethodArgumentResolver类进行参数值映射。
SpringMvc接口调用的核心方法invokeForRequest在InvocableHandlerMethod类中,大家有兴趣,可以自己阅读下源码:
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
//从request中读取,转化参数值
Object[] args = getMethodArgumhttp://entValues(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;
}
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~