SpringBoot如何根据目录结构生成API接口前缀

网友投稿 238 2022-10-29

SpringBoot如何根据目录结构生成API接口前缀

目录一、根据目录结构生成接口前缀二、自定义RequestMappingInfo三、测试

一、根据目录结构生成接口前缀

在写api的接口时,通常有很多版本的迭代,比如:v1、v2。

如图所示,建立的包结构。

列举v1版本,每新建一个controller都要写上@RequestMapping("/v1/****")的路由的前缀,如果v1下面还有几个包结构,这样路由就要写的很麻烦。

我们可以通过当前api下的目录结构自动加上请求前缀。

二、自定义RequestMappingInfo

在Spring里有一个专门处理拥有@RequestMapping()注解的控制器的类(RequestMappingHandlerMapping),因为我们要修改控制器的路由。

写一个类继承RequestMappingHandlerMapping,重写类的getMappingForMethod方法。这个方法就是定义和生成路由。调用基类的getMappingForMethod方法就能拿到RequestMappingInfo 的路由信息,先接受信息,修改完了,再返回。这里要进行路由前缀的修改,封装一个方法getPrefix(),而handlerType这个参数就是获取控制器的信息。获取控制器的目录结构,进行替换,保留api目录之后的路径。这里的apiPackagePath,就是com.api。指定api是所有api的根目录。获取到的请求路径是.,替换为/。得到了prefix前缀,修改MappingInfo。通过RequestMappingInfo的静态方法合并url。

public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {

@Value("${api-package}")

private String apiPackagePath;

@Override

protected RequestMappingInfo getMappingForMethod(Method method, Class> handlerType) {

RequestMappingInfo mappingForMethod = super.getMappingForMethod(method, handlerType);

String prefix = getPrefix(handlerType);

if (mappingForMethod!=null){

return RequestMappingInfo.paths(prefix).build().combine(mappingForMethod);

}

return mappingForMethod;

}

private String getPrefix(Class> handlerType){

String packageName = handlerType.getPackage().getName();

String doPath = packageName.replaceAll(this.apiPackagePath, "");

return doPath.replace('.', '/');

}

}

配置类的方法将AutoPrefixUrlMapping类注入ioc容器中。新建一个配置类继承WebMvcRegistrations接口。实现getRequestMappingHandlerMapping方法,直接实例化AutoPrefixUrlMapping。将配置类加入容器中@Component

@Component

public class AutoPrefixConfiguration implements WebMvcRegistrations {

@OverrMXQuyYZoide

pubMXQuyYZolic RequestMappingHandlerMapping getRequestMappingHandlerMapping() {

return new AutoPrefixUrlMapping();

}

}

三、测试

在v1包下新建一个controller

@RestController()

@RequestMapping("/banner")

public class BannerController {

@GetMapping("/test")

public String test() {

return "你好 hello";

}

}

启动主程序,测试接口http://localhost:8080/v1/banner/test,

自动合并了路由,v1是自动拼接的。

将controller移动到v2的sample包下,controller的请求路径没有修改。

这是重新服务再访问http://localhost:8080/v2/sample/banner/test。

成功访问,不管目录多么复杂都实现了根据目录结构生成路由前缀,不用修改控制器的requestMapping。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Heroku 的“得”与“失”
下一篇:紫米发布带HDMI接口的移动电源可连屏幕、传输4K视频
相关文章

 发表评论

暂时没有评论,来抢沙发吧~