从原理层面掌握HandlerMethod、InvocableHandlerMethod、ServletInvocableHandlerMethod的使用【一起学Spring MVC】 (5)

对@ResponseStatus注解的支持
1.当一个方法注释了@ResponseStatus后,响应码就是注解上的响应码并且,并且如果returnValue=null或者reason不为空(不为null且不为“”),将中断处理直接返回(不再渲染页面)

对返回值returnValue的处理
1. 对返回值的处理是使用HandlerMethodReturnValueHandlerComposite完成的

异步处理结果的处理

使用示例 文首说了,HandlerMethod作为一个非公开API,如果你要直接使用起来,还是稍微要费点劲的。
但本文还是给出一个Demo,给出小伙伴们最为关心也是对你们最有用的一个需求:ModelFactory.getNameForParameter(parameter)这个静态方法是给入参生成默认名称的,当然默认处理方案最底层依赖的是它Conventions.getVariableNameForParameter(parameter),为了验证这块对象、Object、List等等常用数据结构的默认处理,此处我借助HandlerMethod一次性全部打印出这个结论:

@Getter @Setter @ToString public class Person { @NotNull private String name; @NotNull @Positive private Integer age; public Object demoMethod(Person person, Object object, List<Integer> intList, List<Person> personList, Set<Integer> intSet, Set<Person> personSet, Map<String, Object> myMap, String name, Integer age, int number, double money) { return "hello parameter"; } }

借助HandlerMethod完成此测试用例

public static void main(String[] args) { // 准备一个HandlerMethod HandlerMethod handlerMethod = new HandlerMethod(new Person(), getPersonSpecfyMethod()); // 拿到该方法所有的参数 MethodParameter[] methodParameters = handlerMethod.getMethodParameters(); for (MethodParameter parameter : methodParameters) { Class<?> parameterType = parameter.getParameterType(); String nameForParameter = ModelFactory.getNameForParameter(parameter); System.out.println("类型" + parameterType.getName() + "--->缺省的modelKey是:" + nameForParameter); } } private static Method getPersonSpecfyMethod() { for (Method method : Person.class.getMethods()) if (method.getName().equals("demoMethod")) return method; return null; }

运行,打印结果如下:

类型com.fsx.bean.Person--->缺省的modelKey是:person 类型java.lang.Object--->缺省的modelKey是:object 类型java.util.List--->缺省的modelKey是:integerList 类型java.util.List--->缺省的modelKey是:personList 类型java.util.Set--->缺省的modelKey是:integerList // 可以看到即使是set 名称也是同List的 类型java.util.Set--->缺省的modelKey是:personList 类型java.util.Map--->缺省的modelKey是:map 类型java.lang.String--->缺省的modelKey是:string 类型java.lang.Integer--->缺省的modelKey是:integer 类型int--->缺省的modelKey是:int 类型double--->缺省的modelKey是:double

这个结果是不同类型对应的缺省的ModelKey,希望小伙伴们能够记下来,这对理解和正确使用@SessionAttribute、@ModelAttribute都是很重要的~

总结

HandlerMethod虽然接触少,但并不影响它的重要性。在理解Spring MVC的处理流程上它很重要,在与使用者关系较大的拦截器HandlerInterceptor定制化处理的时候,学会使用它一样是非常有必要的。

在最后还提示大家一个你可能没有关心到的小细节:

HandlerMethod位于org.springframework.web.method包下,且是3.1后才有的

MethodParameter位于org.springframework.core核心包中。2.0就存在了

相关阅读

【小家Spring】Spring MVC容器的web九大组件之---HandlerAdapter源码详解---一篇文章带你读懂返回值处理器HandlerMethodReturnValueHandler

知识交流

==The last:如果觉得本文对你有帮助,不妨点个赞呗。当然分享到你的朋友圈让更多小伙伴看到也是被作者本人许可的~==

若对技术内容感兴趣可以加入wx群交流:Java高工、架构师3群。
若群二维码失效,请加wx号:fsx641385712(或者扫描下方wx二维码)。并且备注:"java入群" 字样,会手动邀请入群

若文章格式混乱或者图片裂开,请点击`:原文链接-原文链接-原文链接

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjggx.html