Spring MVC ArgumentResolver参数解析器

参数解析器(ArgumentResolver)是Spring MVC中的一个重要组件,它的作用是将Controller方法的参数解析为绑定到请求的对应值。
常见的几种参数解析器:
  1. RequestParamMethodArgumentResolver解析绑定到@RequestParam注解的参数。

  1. PathVariableMethodArgumentResolver解析绑定到@PathVariable注解的参数。

  1. RequestResponseBodyMethodProcessor解析请求体绑定到方法参数。

  1. ServletModelAttributeMethodProcessor解析绑定到模型属性的参数。

  1. RequestHeaderMethodArgumentResolver解析绑定到@RequestHeader注解的参数。

工作流程是:

  1. 用户发送请求,请求进入DispatcherServlet。

  2. 根据HandlerMapping匹配到请求对应的Controller。

  3. DispatcherServlet调用HandlerAdapter执行Controller处理。

  4. HandlerAdapter会利用参数解析器解析请求,绑定参数。

  5. 执行Controller方法并返回结果。

自定义参数解析器:

  • 实现HandlerMethodArgumentResolver接口
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private StringRedisTemplate template;
@Override
public boolean supportsParameter(MethodParameter parameter) {
    // 实现用户登陆自动注入信息 hasParameterAnnotation 查看是否有UseUserAnnotation 自定义注解,使用则自动注入用户信息
      boolean b = parameter.getParameterType() == User.class && parameter.hasParameterAnnotation(UseUserAnnotation.class);
return b;
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                      NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
String token = request.getHeader("token");
     // 根据token从redis中取出用户信息

String key = RedisKeys.USER_LOGIN_STATE.join(token);
String s = template.opsForValue().get(key);
User user = JSON.parseObject(s, User.class);
     // 返回用户信息

return user;
}
  • 实现supportsParameter() 和 resolveArgument() 方法
  • 在配置类中注册自定义解析器:@Override addArgumentResolvers()
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private UserArgumentResolver userArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userArgumentResolver);
}
}

 

posted on 2023-07-19 19:34  春衫  阅读(369)  评论(0)    收藏  举报