首先看下這個(gè)接口:
public interface HandlerMethodArgumentResolver {
//返回值是boolean類型槐沼,它的作用是判斷Controller層中的參數(shù)儿倒,是否滿足條件仰坦,滿足條件則執(zhí)行resolveArgument方法喝峦,不滿足則跳過财饥。
boolean supportsParameter(MethodParameter var1);
//在supportsParameter方法返回true的情況下才會(huì)被調(diào)用屁柏。用于處理一些業(yè)務(wù)文兢,將返回值賦值給Controller層中的這個(gè)參數(shù)漠另。
@Nullable
Object resolveArgument(MethodParameter var1, @Nullable ModelAndViewContainer var2, NativeWebRequest var3, @Nullable WebDataBinderFactory var4) throws Exception;
}
知道了這個(gè)接口的方法作用格嗅,就可以利用這個(gè)接口做一些前置操作番挺。例如入?yún)魈囟╥d,獲取相關(guān)用戶信息屯掖。避免重復(fù)代碼玄柏。
接下來實(shí)踐一下:
public class UserArgumentResovler implements HandlerMethodArgumentResolver {
private UserService userService;
//構(gòu)造方法注入userService
public UserArgumentResovler(UserService userService){
this.userService = userService;
}
//預(yù)定只有使用RequireUser注解的屬性,才進(jìn)行參數(shù)解析構(gòu)造
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(RequireUser.class);
}
//根據(jù)請(qǐng)求頭中的id贴铜,獲取用戶信息粪摘,賦值給參數(shù)
@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);
}
然后將我們編寫的配置類瀑晒,注冊(cè)到配置類中
@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中使用指定參數(shù)解析器來獲取用戶信息(注解的編寫略)
public void queryYhssyxxForsb(@RequireUser User user) {
}
這樣就可以在控制類方法中愉快的使用獲取到的用戶信息啦苔悦。