首先看下这个接口:
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) {
}
这样就可以在控制类方法中愉快的使用获取到的用户信息啦。
网友评论