最近我们的项目中的有一个获取客户ID的方法多次调用(数据库分离,每查一次客户ID,就要调用该方法一次),为了统一管理和减少代码的冗余,使用了Spring MVC的参数解析器,我们先看下官方描述
public interface HandlerMethodArgumentResolver
Strategy interface for resolving method parameters into argument values in the context of a given request.
这是官方文档上的描述,(感兴趣的同学可以http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/method/support/HandlerMethodArgumentResolver.html看下),从描述上可以看出是将请求的上下文中将方法参数解析为参数值,描述是如此的简单,以我个人的理解就是你在请求mvc的时候,假如有一个ID,然后你想要这个ID相对应的name或者其他字段,如果你不用参数解析器的话,可能你写个sql,请求一下就得到,但是会面临一个问题,如果多次通过该ID获取相对应的字段,那我们的代码冗余不说,还浪费我们一次一次的去写,正好HandlerMethodArgumentResolver帮我们解决了这个问题,在我们请求mvc的时候,HandlerMethodArgumentResolver会帮我们做参数的拦截处理,返回我们希望得到的结果,然后再使用,更加的简单了有没有。 首先HandlerAdapter会检查所有的 HandlerMethodArgumentResolver,如果你有相关操作,那么就会执行完以后再返回。 HandlerMethodArgumentResolver接口有2个方法:
boolean supportsParameter(MethodParameter parameter);
该方法是描述是否支持参数解析,只要返回True就行,一般是你需要处理的类型,即你需要返回的类型,假如你传入一个String类型的字符串"2017-07-15 10:00:00",想返回一个Date类型的,你可以直接比较
return parameter.getParameterType() == Date.class;
或者不想比较也可以直接返回True
第二个方法为:
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
注意 parameter the method parameter to resolve. This parameter must have previously been passed to {@link #supportsParameter} which must*have returned {@code true}
官方描述了MethodParameter parameter参数必须传递给上面的第一个方法,并且返回True,还有一个参数NativeWebRequest webRequest要注意下,一般我们处理的参数都是操作该类型,webRequest.getParameter(key)
即可得到你请求MVC的参数,这个key就是你对应的参数名,(比如"name" : "xiaoming"),key = "name",返回的就是xiaoming,然后我们在这里(resolveArgument方法)可以写自己的业务操作,比如通过ID查到客户信息,然后可以直接
返回,返回类型Object就是。