在REST API中很多時候需要獲得用戶信息,分頁參數,定義自己的註解完成參數的解析注入,使得代碼簡潔高效。
在Spingboot提供的基礎上實現非常方便,需要三個步驟:定義註解、定義解析器類、註冊解析器。
以解析JWT token爲例,實現一個獲取令牌信息的功能。
- 定義註解
/**
* 註解自動獲得當前登錄用戶
*/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthUser {
boolean value() default true;
}
- 定義解析器類
@Component
public class AuthUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
// 判斷是否是包含註解,啓動解析
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(AuthUser.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 這裏代碼需要換成具體需求的實現邏輯
// 獲取令牌
String token = webRequest.getHeader("Authorization");
// 返回解析後的結果
return JWTUtil.DecodeToken(token);
}
}
- 註冊解析器
@Configuration
public class WebConfig implements WebMvcConfigurer {
/** 註冊參數裝飾器解析 */
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new AuthUserMethodArgumentResolver());
}
}
通過重寫
addArgumentResolvers
方法實現,可以調用argumentResolvers.add()
添加多個解析器。