因爲自己有一個業務,需要判斷用戶的郵箱和手機號存在不存在,幾乎每個接口都有。但是每個接口可能是郵箱可能是手機號.所以準備用註解實現
另外,我這裏多加了一個用戶類型,可以多參數設置
參考文章 : Springboot 之 自定義方法參數解析器
1. 參數枚舉
public enum XkjParamEnum {
USER,
EMAIL,
PHONE,
}
2. 自定義註解
import cn.newsalary.xkj.perm.biz.enums.XkjParamEnum;
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface XkjParam {
XkjParamEnum type();
/**
* @see <a href="https://github.com/alibaba/fastjson/wiki/JSONPath">https://github.com/alibaba/fastjson/wiki/JSONPath</a>
*/
String value() default "";
}
3. 自定義方法參數解析器實現
@Component
public class XkjParamResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.hasParameterAnnotation(XkjParam.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory binderFactory) throws Exception {
//獲取參數類類型
Class paramObjClass = parameter.getParameterType();
//根據class new 出對象
Object paramObj = paramObjClass.newInstance();
// 獲取用戶token
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
String token = request.getHeader("Access-Token");
if (StringUtils.isBlank(token)) {
// 返回錯誤信息
throw new CommonException(CommonError.MISSING_TOKEN);
}
XkjParamEnum type = parameter.getParameterAnnotation(XkjParam.class).type();
if (type == null) {
// 返回錯誤信息
throw new CommonException(BizError.XKJPARAM_MISSING);
}
// 是否需要判斷字符串爲空
Boolean isJudgeStringBank = false;
switch (type) {
case USER:
// 這裏判斷接收類型,如果他的註解是User,但是寫成了String,就不返回信息
if (parameter.getParameterType().equals(User.class)) {
// 獲取用戶信息
paramObj = ;
}
break;
case EMAIL:
if (parameter.getParameterType().equals(String.class)) {
// 獲取用戶郵箱信息
paramObj = ;
isJudgeStringBank = true;
}
break;
case PHONE:
if (parameter.getParameterType().equals(String.class)) {
// 獲取手機信息
paramObj = ;
isJudgeStringBank = true;
}
break;
}
if (paramObj == null) {
// 返回錯誤信息
throw new CommonException(BizError.NO_MANAGER_COMPANY);
}
if (isJudgeStringBank) {
if (paramObj == "") {
// 返回錯誤信息
throw new CommonException(BizError.NO_MANAGER_COMPANY);
}
}
return paramObj;
}
}
4. 將自定義的參數解析器配置到spring容器中
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Resource
private XkjParamResolver xkjParamResolver ;
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(xkjParamResolver);
// 註冊Spring data jpa pageable的參數分解器
argumentResolvers.add(new PageableHandlerMethodArgumentResolver());
}
// swagger2 訪問
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
}
5. controller中使用
public Object getUser(@XkjParam(type = XkjParamEnum.USER) User user) {
System.out.println(user);
return new RtnResult<>(user);
}
public Object getUserPhone(@XkjParam(type = XkjParamEnum.PHONE) String phone) {
System.out.println(phone);
return new RtnResult<>(phone);
}
public Object getUserEmail(@XkjParam(type = XkjParamEnum.EMAIL) String email) {
System.out.println(email);
return new RtnResult<>(email);
}
// 這個是錯誤演示,比方說我枚舉是 EMAIL , 但是參數卻是 User, 因爲在後面判斷過,所以這裏是空的值。或者你也可以選擇報錯
public Object getError(@XkjParam(type = XkjParamEnum.EMAIL) User user) {
System.out.println(email);
return new RtnResult<>(email);
}