springmvc利用HandlerMethodArgumentResolver在调用时注入用户
首先做好准备,新建springboot项目,添加web和lombok依赖,新建controller,user
@Getter
@Setter
@ToString
public class User {
private String name;
private String sex;
private Integer age;
}
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {这里需要通过自定义注解的方式将User直接注入进来 @MyUser User user
return "";
}
}
将User注入进来,就不用每次在controller里面调用方法查找当前登录的User,这就是我们的目标
首先新建一个自定义注解@MyUser
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyUser {
}
然后新建一个类实现HandlerMethodArgumentResolver接口
public class AutoUserResolver implements HandlerMethodArgumentResolver {
public boolean supportsParameter(MethodParameter methodParameter) {
if (methodParameter.hasParameterAnnotation(MyUser.class)) {
return true;
} else if (methodParameter.getMethodAnnotation(MyUser.class) != null) {
return true;
}
return false;
}
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory)
throws Exception {
User user = new User();
user.setName("小朱");
user.setAge(23);
user.setSex("男");
return user;
}
}
HandlerMethodArgumentResolver接口就是专门来处理参数的解析器,spring中做了很多的实现来处理大多数情况,supportsParameter方法就是用来判断要不要进行操作(这里也就是是不是@MyUser注解表示的参数),当supportsParameter方法返回true时,resolveArgument就进行需要的操作,这里也就是将用户信息返回给参数,这里的User可以通过查找数据库,也可以通过拦截器传递过来
将自定义的解析器写好了过后还需要将它注册到mvc中,所以要写一个配置类来注册
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(addResolvers());//这里就将自定义的AutoUserResolver注册进去了
}
@Bean
public HandlerMethodArgumentResolver addResolvers(){
return new AutoUserResolver();
}
}
现在我们去改一下controller,直接将拿到的user输出一下
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(@MyUser User user) {
return user.toString();
}
}
http://localhost:8080/hello走一下
就发现User成功拿到了