在上篇文章 https://www.jianshu.com/p/3819b7fe604f 写了根据目录生成路由前缀
在集成swagger3的时候发现弹窗报错
这时候debug可以发现,在自定义路由前缀代码那里,它处理了swagger的前缀,但我设置路由前缀的初心是为了定义自己项目的路由前缀。
这时候解决报错很简单,只需要再加个判断只处理自己的包的路由前缀即可。
关键代码就是加了这行代码判断
handlerType.getPackageName().contains(this.apiPackagePath)
修改后的完整代码如下
package cn.wangningbo.mall.core.hack;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.lang.reflect.Method;
/**
 * 自定义 RequestMappingHandlerMapping 处理目录生成路由前缀
 *
 * @author wangningbo
 */
public class AutoPrefixUrMapping extends RequestMappingHandlerMapping {
    @Value("${mall.api-package}")
    private String apiPackagePath;
    @Override
    protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
        RequestMappingInfo mappingInfo = super.getMappingForMethod(method, handlerType);
        if (mappingInfo != null && handlerType.getPackageName().contains(this.apiPackagePath)) {
            String prefix = this.getPrefix(handlerType);
            return RequestMappingInfo.paths(prefix).build().combine(mappingInfo);
        }
        return mappingInfo;
    }
    /**
     * 获取路由前缀
     *
     * @param handlerType
     * @return
     */
    private String getPrefix(Class<?> handlerType) {
        String packageName = handlerType.getPackageName();
        String doPath = packageName.replaceAll(this.apiPackagePath, "");
        return doPath.replace(".", "/");
    }
}