Controller入参简化(HandlerMethodArgumentResolver)

  • Post author:
  • Post category:其他


场景:MVC三层框架中,Controller层经常传输对象,而这些对象经常需要校验。

简单的参数校验一般指对象的变量非空、长度限制的,可以参考另一篇文章:

@Validated 简化参数校验

推荐阅读:

HandlerMethodArgumentResolver的简单使用

核心:


HandlerMethodArgumentResolver

解析器,

功能:解析request请求参数,绑定数据到

Controller的入参


核心:

  1. 自定义方法参数解析器

    HandlerMethodArgumentResolver

    接口
  2. 添加该解析器到配置中:

    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

boolean supportsParameter(MethodParameter parameter);

见名知义,判断参数是否目标类。是则返回true,才会进入另一个方法进行处理。

一般是两种处理:

  1. 根据类判断

    Class<?> clazz = parameter.getParameterType();
    return clazz == xxx.class;
    //clazz.isAssignableFrom(xxx.class);
    //clazz instanceof xxx.class ...
    

    附:

    isAssignableFrom()与instanceof的区别

  2. 根据注解判断

    boolean res = parameter.hasParameterAnnotation(xxx.class);
    return res;
    

拓:两者可以一起用。

eg: 根据类a判断,但不是每个

Controller

都要判断,则自定义注解b,并加入判断。

return parameter.getParameterType().isAssignableFrom(a.class)
             && parameter.hasParameterAnnotation(b.class);


方法二、

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参数解析器


本文完,有误欢迎指出



版权声明:本文为Unknownfuture原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。