RequestMappingHandlerMapping

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiVersion
{
	/**
	 * 标识版本号,从1开始
	 */
	String value() default "V001";
}

public class ApiRequestMappingHandlerMapping extends RequestMappingHandlerMapping
{
    @Override
    protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType)
    {
        // 扫描类上的 @ApiVersion
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);
        return createRequestCondition(apiVersion);
    }

    @Override
    protected RequestCondition<?> getCustomMethodCondition(Method method)
    {
        // 扫描方法上的 @ApiVersion
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class);
        return createRequestCondition(apiVersion);
    }

    /**
     * 获取请求版本号
     * @param apiVersion
     * @return
     */
    private RequestCondition<ApiVersionCondition> createRequestCondition(ApiVersion apiVersion)
    {
        if (Objects.isNull(apiVersion))
        {
            return null;
        }
        String version = apiVersion.value().substring(1);
        int value = Integer.parseInt(apiVersion.value().substring(1));
        Assert.isTrue(value >= 1, "Api Version Must be greater than or equal to 1");
        return new ApiVersionCondition(version);
    }
}

public class ApiVersionCondition implements RequestCondition<ApiVersionCondition>
{
    /** 版本 **/
    private static final String VERSION = "version";
    /** 默认版本 **/
    private static final String DEFAULT_VERSION = "V001";
    
    private String apiVersion;

    ApiVersionCondition(String apiVersion)
    {
        this.setApiVersion(apiVersion);
    }

    /**
     * 最近优先原则,方法定义的 @ApiVersion > 类定义的 @ApiVersion
     */
    @Override
    public ApiVersionCondition combine(ApiVersionCondition other)
    {
        return new ApiVersionCondition(other.getApiVersion());
    }

    /**
     * 获得符合匹配条件的ApiVersionCondition
     */
    @Override
    public ApiVersionCondition getMatchingCondition(HttpServletRequest request)
    {
    	// 跨域请求则不满足
        if (CorsUtils.isPreFlightRequest(request))
        {
            return null;
        }
        String version = request.getHeader(VERSION);
        // 获取所有小于等于版本的接口;如果前端不指定版本号,则默认请求1.0.0版本的接口
        if (StringUtils.isEmpty(version))
        {
            version = DEFAULT_VERSION;
        }
        int oldVersion = Integer.parseInt(getApiVersion());
        //如果请求的版本号大于等于配置版本号, 则满足
        if (Integer.parseInt(version.substring(1)) >= oldVersion)
        {
            return this;
        }
        return null;
    }

    /**
     * 当出现多个符合匹配条件的ApiVersionCondition,优先匹配版本号较大的
     */
    @Override
    public int compareTo(ApiVersionCondition other, HttpServletRequest request)
    {
        return Integer.parseInt(other.getApiVersion()) - Integer.parseInt(getApiVersion());
    }

	public String getApiVersion()
	{
		return apiVersion;
	}

	public void setApiVersion(String apiVersion)
	{
		this.apiVersion = apiVersion;
	}
}

@Configuration
public class WebMvcRegistrationsConfig implements WebMvcRegistrations
{
	// 注册自定义RequestMappingHandlerMapping
	@Override
	public RequestMappingHandlerMapping getRequestMappingHandlerMapping()
	{
		return new ApiRequestMappingHandlerMapping();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值