springboot通过自定义RequestMappingHandlerMapping和HandlerInterceptor实现多版本接口控制及兼容

springboot1.5.7

直接看代码

 

/**
 * @author ikong
 * @create 2019-07-30 11:34
 **/
@Configuration
public class VersionConfiguration extends WebMvcRegistrationsAdapter {

    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new CustomRequestMappingHandlerMapping();
    }

    @Bean
    protected RequestMappingHandlerMapping customRequestMappingHandlerMapping() {
        return new CustomRequestMappingHandlerMapping();
    }

}
父类最开始使用的是WebMvcConfigurationSupport,发现之前配置的所有interceptors全部失效,最后改成WebMvcRegistrationsAdapter

自定义的mapping

/**
 * @author ikong
 * @create 2019-07-30 11:19
 **/
public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping {

    @Override
    protected RequestCondition<ApiVesrsionCondition> getCustomTypeCondition(Class<?> handlerType) {
        ApiVersion apiVersion = findAnnotation(handlerType, ApiVersion.class);
        return createCondition(apiVersion);
    }

    @Override
    protected RequestCondition<ApiVesrsionCondition> getCustomMethodCondition(Method method) {
        ApiVersion apiVersion = findAnnotation(method, ApiVersion.class);
        return createCondition(apiVersion);
    }

    private RequestCondition<ApiVesrsionCondition> createCondition(ApiVersion apiVersion) {
        return apiVersion == null ? null : new ApiVesrsionCondition(ApiVesrsionCondition.versionStrToNum(apiVersion.value()), apiVersion.value());
    }

}

ApiVesrsionCondition,是mapping类,用于记录代码中已经存在mapping和http请求过来的mapping

/**
 * @author ikong
 * @create 2019-07-30 11:18
 **/
public class ApiVesrsionCondition implements RequestCondition<ApiVesrsionCondition> {
    private int apiVersion;
    private String version;

    public ApiVesrsionCondition(int apiVersion, String version) {
        this.apiVersion = apiVersion;
        this.version = version;
    }

    //将不同的筛选条件合并,这里采用的覆盖,即后来的规则生效
    @Override
    public ApiVesrsionCondition combine(ApiVesrsionCondition other) {
        return new ApiVesrsionCondition(other.getApiVersion(), other.getVersion());
    }

    //根据request查找匹配到的筛选条件
    @Override
    public ApiVesrsionCondition getMatchingCondition(HttpServletRequest request) {
        System.out.println(request.getRequestURI());
        String versionStr = request.getParameter("version");
        int version = ApiVesrsionCondition.versionStrToNum(versionStr);
        // 如果请求的版本号大于配置版本号, 则满足,即与请求的
        if (version >= this.apiVersion) {
            return this;
        }
        return null;
    }

    //实现不同条件类的比较,从而实现优先级排序
    @Override
    public int compareTo(ApiVesrsionCondition other, HttpServletRequest request) {

        return other.getApiVersion() - this.apiVersion;
    }

    public int getApiVersion() {
        return apiVersion;
    }

    public String getVersion() {
        return version;
    }

    public static int versionStrToNum(String versionStr) {
        System.out.println(versionStr);
        if (StringUtils.isEmpty(versionStr) || !versionStr.contains(".")) {
            return 0;
        }
        String[] arr = versionStr.split("\\.");
        StringBuilder sb = new StringBuilder();
        for (String num : arr) {
            String str = String.format("%03d", Integer.valueOf(num));
            sb.append(str);
        }
        int version = Integer.valueOf(sb.toString());
        return version;
    }

}
ApiVersion,注解,通过配置注解上的版本号,根据版本号大小作为优先级,版本号越大优先级越高进行调用,没有配置版本号的,默认为0

测试类

/**
 * @author ikong
 * @create 2019-07-30 11:23
 **/
@RequestMapping("vc")
@Controller
public class VersionController {
    @RequestMapping("hello")
    @ResponseBody
    public String hello0() {
        System.out.println("haha0..........");

        return "hello version0";
    }

    @RequestMapping("hello")
    @ApiVersion("1.2.1")
    @ResponseBody
    public String hello() {
        System.out.println("haha1..........");

        return "hello version1";
    }

    @RequestMapping("hello")
    @ApiVersion("1.2.2")
    @ResponseBody
    public String hello2() {
        System.out.println("haha2.........");

        return "hello version2";
    }

    @RequestMapping("hello")
    @ResponseBody
    @ApiVersion("1.2.5")
    public String hello5() {
        System.out.println("haha5.........");
        return "hello version5";
    }

    @RequestMapping("test")
    @ResponseBody
    public String test() {
        return "test";
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码者人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值