在基于SpringMVC的WEB服务开发过程中,经常会遇到如入参解密、返参加密这样的过程,这个过程可能需要很多代码可能只需要一行调用,但是每个Controller都需要调用这样一个方法就可能会感觉繁琐,而且不利于主要业务代码阅读,有时会影响项目架构。本文通过一个小案例,基于Spring AOP思想来解决类似这样的问题,希望能起到举一反三的作用,在开发过程中能够解决一些问题、减小代码的重复,用最少的代码完成功能。
SpringMVC的基本过程
使用SpringMVC时,所有的请求都是最先经过DispatcherServlet的,然后由DispatcherServlet选择合适的HandlerMapping和HandlerAdapter来处理请求,HandlerMapping的作用就是找到请求所对应的方法,而HandlerAdapter则来处理和请求相关的的各种事情,比如参数如何绑定到@RequestMapping的方法中,参数如何返回到Model中等。
SpringMVC Controller参数解析是由RequestMappingHandlerAdapter
类进行处理的,这个类通过一个List维护不仅维护了SpringMVC自带的参数解析方法,同时也支持用自定义的参数解析器。SpringMVC通过查询List中的解析器,如果找到一个能支持解析的对象,就会让它去解析而不会再去查找其它的解析器。所以一般来讲Controller方法的入参模型实体类只有一个对应的解析器去处理。
参数绑定接口是HandlerMethodArgumentResolver
,接口定义了两个方法: boolean supportsParameter(MethodParameter parameter)
需要返回该解析器是否支持参数 parameter的封装,支持就返回true;然后具体的解析业务由接口的另一个方法 Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)
处理,并返回处理后的对象。
以下代码支持有@MobileRequestParam注解的Controller方法参数进行参数绑定。
public class EhrMobileRequestParamResolver implements HandlerMethodArgumentResolver {
private static final Logger logger = LoggerFactory.getLogger(EhrMobileRequestParamResolver.class);
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(MobileRequestParam.class);
}
/**
* 解析json串,并绑定传参
*/
@Override
public Object resolveArgument(MethodParameter parameter