使用过springmvc 都知道使用 requestParam requestBody 等注解,即可轻松帮我们绑定相应参数。那么如果我们自己需要实现一个参数绑定功能,如何做呢?spring mvc 提供了一个HandlerMethodArgumentResolver 接口,实现2个方法即可搞定。
public boolean supportsParameter(MethodParameter parameter) 此方法返回一个boolean 若为true 则进解析填充值,可在此方法检测某个class 是否存在或 指定注解是否存在判断是否需要解析填充值
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory)
解析返回值
写个demo吧 若方法存在UserInfo类型参数,则自动填充。
public class UserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
//parameter.hasParameterAnnotation(xx.class);
return parameter.getParameterType().equals(UserInfo.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
//HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String token = webRequest.getHeader(Constant.TOKEN);
if(StringUtils.isNotBlank(token)) {
return RedisUtils.getUserInfo(token);
}
return null;
}
}
spring boot 方式集成
@Configuration
public class MyArgumentResolverAutosConfiguration extends WebMvcConfigurerAdapter {
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new UserInfoMethodArgumentResolver());
}
}