HandlerInterceptor经常被用来解决拦截事件,如用户鉴权等。另外,Spring也向我们提供了多种解析器Resolver,如用来统一处理异常的HandlerExceptionResolver,以及今天的主角HandlerMethodArgumentResolver。HandlerMethodArgumentResolver是用来处理方法参数的解析器,包含以下2个方法:
- supportsParameter(返回boolean类型,为true时表示可以调用resolveArgument做参数处理)
- resolveArgument 返回对象替换方法参数
实现方法:
- 自定义个注解
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrUser {
}
- 实现 HandlerMethodArgumentResolver 接口
public class HandlerUserArgumentResolver implements HandlerMethodArgumentResolver {
/**
* 是否支持
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
//只处理加了@CurrUser的参数
return parameter.getParameterAnnotation(CurrUser.class) != null;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
//这里根据自己业务逻辑返回用户信息
return new UserDetails("admin",true);
}
}
-
配置
@Slf4j @Configuration public class WebConfiguration implements WebMvcConfigurer{ @Bean public HandlerMethodArgumentResolver handlerUserArgumentResolver(){ return new HandlerUserArgumentResolver(); } @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add( handlerUserArgumentResolver() ); log.info(" add user resolver success"); } }