在上篇文章 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(".", "/");
}
}
网友评论