一狱庇、使用場(chǎng)景介紹
HandlerMethodArgumentResolver,中文稱為方法參數(shù)解析器恶耽,是Spring Web(SpringMVC)組件中的眾多解析器之一密任,主要用來對(duì)Controller中方法的參數(shù)進(jìn)行處理。
在一般的接口調(diào)用場(chǎng)景下偷俭,每次調(diào)用Controller都需要檢查請(qǐng)求中的token信息浪讳,并根據(jù)token還原用戶信息,然后將用戶信息封裝到Controller的方法參數(shù)中涌萤,供方法中接下來的邏輯使用淹遵。
二、使用案例介紹
我們新建一個(gè)SpringBoot工程形葬,用來實(shí)現(xiàn)獲取請(qǐng)求中的token合呐,還原為用戶的信息,封裝到Controller方法參數(shù)中笙以。
@Data
public class User {
private String name;
private String gender;
private Integer age;
}
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
@Slf4j
@RestController
public class MyController {
@GetMapping("getMyHello")
public String getMyHello(@CurrentUser User currentUser){
log.info("current user info: {}", currentUser);
return "hello";
}
}
@Slf4j
@Component
public class CurrentUserResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CurrentUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
User currentUser = new User();
if(User.class != parameter.getParameterType()){
log.error("入?yún)⒂脩纛愋筒徽_淌实!");
return null;
}
// 請(qǐng)求header中有Authorization的值表示token,根據(jù)token解析出當(dāng)前用戶的信息
HttpServletRequest httpServletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
String token = httpServletRequest.getHeader("Authorization");
// 如下模擬token的解析過程
if("123".equals(token)){
currentUser.setName("zhangsan");
currentUser.setGender("male");
currentUser.setAge(12);
}
return currentUser;
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private CurrentUserResolver currentUserResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserResolver);
}
}
如上都是必須的內(nèi)容猖腕,啟動(dòng)應(yīng)用后拆祈,發(fā)起如下HTTP請(qǐng)求:
GET
http://localhost:8080/getMyHello
Head
Authorization=123
就能發(fā)現(xiàn)getMyHello
方法中的參數(shù)currentUser
被填充進(jìn)去了。
三倘感、其它解析器
除此之外放坏,Spring還提供了其它有用的解析器,供特定場(chǎng)景下使用:
- 異常解析器老玛,對(duì)捕獲的異常進(jìn)行解析處理淤年;
- 視圖解析器钧敞,將controller返回的string解析為一個(gè)視圖地址;
- 類型轉(zhuǎn)換解析器麸粮;
- 文件上傳解析器溉苛;
- 等等其它;