HandlerMethodArgumentResolver参数解析器

首先看下这个接口:

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 resolvers) {
        resolvers.add(new UserArgumentResovler(userService));
    }

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

 public void queryYhssyxxForsb(@RequireUser User user) {
    }

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

你可能感兴趣的:(HandlerMethodArgumentResolver参数解析器)