使用 HandlerMethodArgumentResolver 自定义处理Controller中接收参数
一、
1、配置类中加 自定参数解析器
/**
* 注册外部的interceptor WebConfig
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 配置外部HandlerMethodArgumentResolver
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new HandleFirstArgsRevlover());
}
}
2、 使用自定义参数解析器,先判断参数中包含如果 UserInfo类型参数时会执行 resolveArgument,并返回处理后的参数 如action
/**
* 保存用户信息
* @param userInfo
* @param role
* @return
*/
@RequestMapping("saveUser")
public Result saveUserInfo(com.hualala.order.common.Common.UserInfo userInfo, Role role){
System.out.println("userInfo = " + userInfo);
return new Result();
}
当saveUserinfo执行时,所有默认解析器和自定义解析器会遍历每个参数,如遍历到符合HandleFirstArgsRevlover会进行处理(每个参数会进行参数解析器遍历匹配),如果supportsParameter返回ture符合会执行resolveArgument并返回处理后的参数对象
public class HandleFirstArgsRevlover implements HandlerMethodArgumentResolver {
/**
* 验证参数是否满足,返回 true: 执行resolveArgument , fasle:不执行执行resolveArgument
* @param parameter
* @return
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
Class<?> paraType = parameter.getParameterType();
return null == paraType.getAnnotationsByType(RequestBody.class) && UserInfo.class.equals(paraType);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request=webRequest.getNativeRequest(HttpServletRequest.class);
String userId= request.getParameter("id");
if(StringUtils.isNotBlank(userId)){
UserInfo userInfo=new UserInfo();
userInfo.setId(userId);
userInfo.setUserName("firstName");
userInfo.setLoginId("152013303300");
return userInfo;
}
return null;
}
}
ps:注意有使用 @RequestBody和其它**注解的参数,自定义参数解析器不执行,因为spring针对参数解析器有些默认的解析器,当遇到这些默认解析器会优先执行,并不在执行后续自定义解析器
二、可以使用自定义注解 用于标示哪些参数需要解析处理
参照:https://blog.csdn.net/u010675669/article/details/91501599

浙公网安备 33010602011771号