一、概述
在实际业务场景中,有时会需要统一增加一些Controller的前缀,比如统一增加V1版本号,或者按照不同业务增加不同的前缀,比如系统服务/system,用户服务/user。但是项目时间比较久,代码比较多,本着开闭原则,利用SpringMVC的WebMvcRegistrations和RequestMappingHandlerMapping类来通过增加配置类优雅实现此需求。
二、实现
配置文件配置形式如下:
代码语言:javascript复制#api路径前缀
api.url.perfixs.com.shy.api.system.controller=/api/system
api.url.perfixs.com.shy.api.user.controller=/api/user
配置加载类
代码语言:javascript复制@Configuration
@ConfigurationProperties(prefix = "api.url")
public class UrlPerfixProperties {
private Map<String, String> perfixs = new HashMap<>();
/**
* @return the perfixs
* @author javascc@126.com
* @date 2023年4月26日 上午10:26:33
*/
public Map<String, String> getPerfixs() {
return this.perfixs;
}
/**
* @author javascc@126.com
* @date 2023年4月26日 上午10:26:33
* @param perfixs the perfixs to set
*/
public void setPerfixs(Map<String, String> perfixs) {
this.perfixs = perfixs;
}
/*
* (非 Javadoc) <p>Title: toString</p> <p>Description: </p>
*
* @return
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "UrlPerfixProperties [perfixs=" this.perfixs "]";
}
}
核心实现
代码语言:javascript复制public class UrlPerfixHandlerMapping extends RequestMappingHandlerMapping {
private UrlPerfixProperties properties;
/**
* <p>
* Title:
* </p>
* <p>
* Description:
* </p>
*
* @author javascc@126.com
* @date 2023年4月26日 上午10:35:17
* @param properties
*/
public UrlPerfixHandlerMapping(UrlPerfixProperties properties) {
super();
this.properties = properties;
}
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMappingInfo info = super.getMappingForMethod(method, handlerType);
if (info != null) {
for (String packageNameConfig : this.properties.getPerfixs().keySet()) {
if (handlerType.getPackage().getName().startsWith(packageNameConfig)) {
//注意以前版本可以不配置
BuilderConfiguration configuration = new BuilderConfiguration();
configuration.setPatternParser(PathPatternParser.defaultInstance);
return RequestMappingInfo.paths(this.properties.getPerfixs().get(packageNameConfig))
.options(configuration).build().combine(info);
}
}
}
return info;
}
}
注入
代码语言:javascript复制@Configuration
public class UrlPerfixConfig implements WebMvcRegistrations {
@Resource
private UrlPerfixProperties properties;
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new UrlPerfixHandlerMapping(this.properties);
}
}