如題:在一個controller的請求方法中,有兩個自定義的參數(shù)注解@UserInfo和@SchoolInfo
@RequestMapping(value = "/filter/test2")
public String test2(@RequestBody String o, @UserInfo UserInfoVo userInfoVo, @SchoolInfo SchoolInfoVo schoolInfoVo) {
System.out.println("Controller中獲取的請求數(shù)據(jù):" + o);
System.out.println("自定義注解UserInfo的值:" + userInfoVo);
System.out.println("自定義注解SchoolInfo的值:" + schoolInfoVo);
return "OK";
}
實現(xiàn)兩個參數(shù)解析器如下:
public class LoginUserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// return parameter.getParameterType().equals(UserInfoVo.class);
System.out.println("login" + parameter.hasParameterAnnotation(UserInfo.class));
return parameter.hasParameterAnnotation(UserInfo.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest httpServletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String str = HttpHelper.getBodyString(httpServletRequest);
System.out.println("參數(shù)解析器login獲取的請求數(shù)據(jù):" + str);
UserInfoVo u = new UserInfoVo();
u.setName("洪桓");
u.setAge(233);
return u;
}
}
public class SchoolInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
System.out.println("school" + parameter.hasParameterAnnotation(SchoolInfo.class));
return parameter.hasParameterAnnotation(SchoolInfo.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest httpServletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String str = HttpHelper.getBodyString(httpServletRequest);
System.out.println("參數(shù)解析器school獲取的請求數(shù)據(jù):" + str);
SchoolInfoVo schoolInfoVo = new SchoolInfoVo();
schoolInfoVo.setName("HNU");
schoolInfoVo.setYear(1980);
return schoolInfoVo;
}
}
WebMvcConfigurerAdapter中實現(xiàn)順序如下:
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new LoginUserInfoMethodArgumentResolver());
argumentResolvers.add(new SchoolInfoMethodArgumentResolver());
}
最后輸出結(jié)果
logintrue
loginfalse
schooltrue
如果按照list的添加順序算的話,第一遍掃描判斷parameter.hasParameterAnnotation(UserInfo.class)是true,第二遍掃描parameter.hasParameterAnnotation(UserInfo.class)和parameter.hasParameterAnnotation(SchoolInfo.class)分別是flase和true,為什么第二次參數(shù)解析器中會返回false
1 回答

墨色風(fēng)雨
TA貢獻(xiàn)1853條經(jīng)驗 獲得超6個贊
第一次是傳 @UserInfo UserInfoVo userInfoVo
進(jìn)去,所以是true
第二次是傳 @SchoolInfo SchoolInfoVo schoolInfoVo
進(jìn)去,所以是false,然后遍歷到 SchoolInfoMethodArgumentResolver
返回true了
添加回答
舉報
0/150
提交
取消