场景:MVC三层框架中,Controller层经常传输对象,而这些对象经常需要校验。
简单的参数校验一般指对象的变量非空、长度限制的,可以参考另一篇文章:
@Validated 简化参数校验
推荐阅读:
HandlerMethodArgumentResolver的简单使用
核心:
HandlerMethodArgumentResolver
解析器,
功能:解析request请求参数,绑定数据到
Controller的入参
核心:
-
自定义方法参数解析器
HandlerMethodArgumentResolver
接口 -
添加该解析器到配置中:
addArgumentResolvers方法
Controller层能在方法参数注入
HttpServletRequest、Model
等也是这个原理
自定义方法参数解析器
HandlerMethodArgumentResolver
接口内有两个方法
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory)
throws Exception;
}
方法一:
supportsParameter
supportsParameter
boolean supportsParameter(MethodParameter parameter);
见名知义,判断参数是否目标类。是则返回true,才会进入另一个方法进行处理。
一般是两种处理:
-
根据类判断
Class<?> clazz = parameter.getParameterType(); return clazz == xxx.class; //clazz.isAssignableFrom(xxx.class); //clazz instanceof xxx.class ...
-
根据注解判断
boolean res = parameter.hasParameterAnnotation(xxx.class); return res;
拓:两者可以一起用。
eg: 根据类a判断,但不是每个
Controller
都要判断,则自定义注解b,并加入判断。return parameter.getParameterType().isAssignableFrom(a.class) && parameter.hasParameterAnnotation(b.class);
方法二、
resolveArgument
resolveArgument
Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory)
throws Exception;
本方法的参数中,用的比较多的就是
webRequest
,通过获取具体的
Request
类,进而获取参数。再进而判断。
(其他的参数,笔者也不清楚,也搜索不到相关资料,就不班门弄斧了。)
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
request.getParameter(xxx);
添加到配置中
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
//实现了HandlerMethodArgumentResolver接口的,自定义解析器
// 当然了,此处用@Autowired,那该类肯定是要注册到spring中的,@Component、@Service等
@Autowired
UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
//添加到配置中
argumentResolvers.add(userArgumentResolver);
}
}
核心是
addArgumentResolvers
方法。
不一定是继承该父类,还有其他的父类也有该方法,如
WebMvcConfigurationSupport类
,该类方法就比较全。
详细用法和案例可以参考:
HandlerMethodArgumentResolver用于统一获取当前登录用户
参考博文:
Spring自定义argumentResolver参数解析器
本文完,有误欢迎指出