Spring MVC ArgumentResolver参数解析器
参数解析器(ArgumentResolver)是Spring MVC中的一个重要组件,它的作用是将Controller方法的参数解析为绑定到请求的对应值。
常见的几种参数解析器:
常见的几种参数解析器:
-
RequestParamMethodArgumentResolver解析绑定到@RequestParam注解的参数。
-
PathVariableMethodArgumentResolver解析绑定到@PathVariable注解的参数。
-
RequestResponseBodyMethodProcessor解析请求体绑定到方法参数。
-
ServletModelAttributeMethodProcessor解析绑定到模型属性的参数。
-
RequestHeaderMethodArgumentResolver解析绑定到@RequestHeader注解的参数。
工作流程是:
-
用户发送请求,请求进入DispatcherServlet。
-
根据HandlerMapping匹配到请求对应的Controller。
-
DispatcherServlet调用HandlerAdapter执行Controller处理。
-
HandlerAdapter会利用参数解析器解析请求,绑定参数。
-
执行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);
}
}
浙公网安备 33010602011771号