根据目录结构自动生成路由前缀
-
自定义RequestMappingInfo
public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping { // 基础包路径 @Value("${api.base.package.path}") private String apiBasePackagePath; @Override protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) { RequestMappingInfo mappingInfo = super.getMappingForMethod(method, handlerType); if(mappingInfo != null) { String prefixPath = this.getPrefixPath(handlerType); // 在原来的requestMapping上加上前缀 return RequestMappingInfo.paths(prefixPath).build().combine(mappingInfo); } return null; } // 获取路由前缀,去掉基础包路径后的目录 private String getPrefixPath(Class<?> handlerType) { String packagePath = handlerType.getPackage().getName(); return packagePath .replaceAll(apiBasePackagePath, "") .replaceAll("\\.", "/"); } }
-
将自定义的RequestMappingInfo注册到Spring容器中
public class AutoPrefixUrlRegister implements WebMvcRegistrations { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new AutoPrefixUrlMapping(); } }
-
访问api
package com.shuguangtj.v1; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class HelloWorldController { @GetMapping(value = "/say") public String say() { return "hello, world"; } }
在配置文件中设置的基础包路径
api.base.package.path = com.shuguangtj
,所以say()方法的访问路径就变成了http://localhost:8080/v1/hello/say,如果把HelloWorld放在了com.shuguangtj.v2包下,访问路径自动就变成了http://localhost:8080/v2/hello/say