Springboot 之 自定義方法多參數解析器

因爲自己有一個業務,需要判斷用戶的郵箱和手機號存在不存在,幾乎每個接口都有。但是每個接口可能是郵箱可能是手機號.所以準備用註解實現
另外,我這裏多加了一個用戶類型,可以多參數設置
參考文章 : 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);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章