HandlerMethodArgumentResolver作用
SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上
有时候直接参数不是我们想要,可以自定义参数解析器转化为我们想要的参数。
实现
1.自定义一个类实现HandlerMethodArgumentResolver接口
接口说明:
- supportsParameter:用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。
- resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
/**
* 参数为User时返回true
* @param methodParameter
* @return
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> clazz = methodParameter.getParameterType();
return clazz== User.class;
//或者搭配注解使用 自定义XXX注解
//return parameter.hasParameterAnnotation(XXX.class);
}
/**
* supportsParameter返回true时执行真正的逻辑代码
* @param methodParameter
* @param modelAndViewContainer
* @param nativeWebRequest
* @param webDataBinderFactory
* @return
* @throws Exception
*/
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory)
throws Exception {
//拿到HttpServletRequest对象
HttpServletRequest request=nativeWebRequest.getNativeRequest(HttpServletRequest.class);
//从request对象中拿到cookie 或者token
//伪代码 通过登录态拿到user 返回user对象给到controller
User user=User.getUser();
return user;
}
}
2.注册到WebMvcConfigurerAdapter中
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {
list.add(userArgumentResolver);
}
}
3.在controller中使用,当方法参数中包含User参数便能通过HandlerMethodArgumentResolver 拿到对应user信息 返回user对象
场景:从前端拿到cookie时 通过cookie从后端拿到注册用户信息作为参数返回给到需要的函数,不用每当需要用户对象时,接口都写一次拿到cookie信息查库返回user。
@RequestMapping("/test")
@ResponseBody
public String testTea(User user, @RequestBody Teacher teacher){
//dosomething...
return user.getName();
}
或者搭配注解使用
@RequestMapping(value = "/getAccount")
@ResponseBody
//自定义注解@getAccount搭配HandlerMethodArgumentResolver
public String getAccountByOpenId(@getAccount String open) {
return open;
}