美文网首页
HandlerMethodArgumentResolver参数解

HandlerMethodArgumentResolver参数解

作者: 目光下的暮光 | 来源:发表于2022-07-26 14:00 被阅读0次

    首先看下这个接口:

    public interface HandlerMethodArgumentResolver {
        //返回值是boolean类型,它的作用是判断Controller层中的参数,是否满足条件,满足条件则执行resolveArgument方法,不满足则跳过。
        boolean supportsParameter(MethodParameter var1);
        //在supportsParameter方法返回true的情况下才会被调用。用于处理一些业务,将返回值赋值给Controller层中的这个参数。
        @Nullable
        Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4) throws Exception;
    }
    

    知道了这个接口的方法作用,就可以利用这个接口做一些前置操作。例如入参传特定id,获取相关用户信息。避免重复代码。

    接下来实践一下:

    public class UserArgumentResovler implements HandlerMethodArgumentResolver {
    
        private UserService userService;
    
        //构造方法注入userService
        public UserArgumentResovler(UserService userService){
            this.userService = userService;
        }
    
        //预定只有使用RequireUser注解的属性,才进行参数解析构造
        @Override
        public boolean supportsParameter(MethodParameter methodParameter) {
            return methodParameter.hasParameterAnnotation(RequireUser.class);
        }
    
        //根据请求头中的id,获取用户信息,赋值给参数
        @Override
        public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
            String id = nativeWebRequest.getHeader(SQZLConst.ID);
            if(EtaxStringUtils.isEmpty(id)){
                throw new RuntimeException("id is null");
            }
            return userService.getUser(id);
        }
    

    然后将我们编写的配置类,注册到配置类中

    @Configuration
    public class DemoConfig implements WebMvcConfigurer {
    
        @Autowired
        private UserService userService;
    
        //将上面我们自定义的HandlerMethodArgumentResolver添加到List中,依赖注入userService
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
            resolvers.add(new UserArgumentResovler(userService));
        }
    
    

    就此,我们就可以在controller中使用指定参数解析器来获取用户信息(注解的编写略)

     public void queryYhssyxxForsb(@RequireUser User user) {
        }
    

    这样就可以在控制类方法中愉快的使用获取到的用户信息啦。

    相关文章

      网友评论

          本文标题:HandlerMethodArgumentResolver参数解

          本文链接:https://www.haomeiwen.com/subject/prdzirtx.html