SpringBoot + 指定包下所有控制器 + 添加统一前缀

2020-03-16  本文已影响0人  吃竹子的程序熊

SpringBoot + 指定包下所有控制器 + 添加统一前缀

自定义版本控制器接口定义

提供两个方法,一个方法是需要添加url前缀的控制器所属的包名称,一个是需要添加的url前缀。

/**
 * 版本控制器
 *
 * @author Hanqi <jpanda@aliyun.com>
 * @since 2019/3/13 16:11
 */
public interface VersionHandler {

    /**
     * 需要处理的控制器所处的包名
     */
    String getPackageName();

    /**
     * 需要添加的前缀
     */
    String getPrefix();
}

简单的版本控制器实现

import org.springframework.stereotype.Component;

/**
 * 版本控制实例
 * @author Hanqi <jpanda@aliyun.com>
 * @since 2019/3/13 16:11
 */
@Component
public class TwoVersionHandler implements VersionHandler {
    @Override
    public String getPackageName() {
        return "com.uustore.uustoreapi.controller";
    }

    @Override
    public String getPrefix() {
        return "v2";
    }
}

实现添加url前缀核心方法的请求映射处理器


import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

public class VersionControlRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
    protected Set<VersionHandler> versionHandlers;
    protected boolean hasVersionHandler = false;

    @Override
    public void afterPropertiesSet() {
        // 初始化版本控制器类型集合
        initVersionHandlers();
        super.afterPropertiesSet();
    }

    @Override
    protected void initHandlerMethods() {
        super.initHandlerMethods();
    }

    @Override
    protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
        RequestMappingInfo info = super.getMappingForMethod(method, handlerType);
        if (info != null) {
            final String packageName = handlerType.getPackage().getName();
            for (VersionHandler versionHandler : versionHandlers) {
                if (packageName.startsWith(versionHandler.getPackageName())) {
                    RequestMappingInfo versionInfo = buildRequestMappingInfo(versionHandler.getPrefix());
                    info = versionInfo.combine(info);
                    return info;
                }
            }
        }
        return info;
    }

    protected void initVersionHandlers() {
        versionHandlers = new HashSet<>(obtainApplicationContext().getBeansOfType(VersionHandler.class).values());
        hasVersionHandler = !CollectionUtils.isEmpty(versionHandlers);
    }

    protected RequestMappingInfo buildRequestMappingInfo(String path) {
        return RequestMappingInfo.paths(path).build();
    }

}

注册使用自定义的请求映射处理器

import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

/**
 * 配置使用自定义版本url处理器
 *
 * @author Hanqi <jpanda@aliyun.com>
 * @since 2019/3/13 16:11
 */
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class VersionControlWebMvcConfiguration implements WebMvcRegistrations {
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new VersionControlRequestMappingHandlerMapping();
    }
}

上一篇下一篇

猜你喜欢

热点阅读