SpringBoot2.x实现给Controller的RequestMapping添加统一前缀
程序员文章站
2023-01-08 14:35:32
目录给controller的requestmapping添加统一前缀总结一下 有几个方法springboot项目添加全局前缀spring的配置spring boot的配置给controller的req...
给controller的requestmapping添加统一前缀
如何给controller的requestmapping添加统一前缀,比如"/api",为什么要添加统一访问前缀,其实是为了后面的接口的管理。
切记:约定与规范好过一切技术处理 !
比如:
- 项目a必须所有访问接口url必须增加 /api/projecta/
- 项目b必须所有访问接口url必须增加 /api/projectb/
- 看到url里面含有/api 表示访问后端接口服务,/projecta/ 一看就知道是项目a提供的服务接口。
总结一下 有几个方法
1、在配置application.yml文件中添加:
servlet: context-path: /api #(不同springboot版本会有区别,这里是采用2.x)
但是这个其实是整个项目访问前缀,如果你有静态资源也需要增加 /api 这个前缀访问。
2、通过nginx 和 你的网关层 添加统一的访问路径前缀,这个不多说了。
3、springmvc 可以实现 webmvcconfigurer 接口中的 configurepathmatch 方法来实现添加统一路径前缀。
package com.middol.webbase.framework.config; import com.middol.webbase.framework.annotation.apirestcontroller; import com.middol.webbase.framework.annotation.reportrestcontroller; import com.middol.webbase.framework.properties.apipathproperties; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.pathmatchconfigurer; import org.springframework.web.servlet.config.annotation.webmvcconfigurer; import javax.annotation.resource; /** * 配置统一的后台接口访问路径的前缀 * @author c西 */ @configuration public class mywebmvcconfig implements webmvcconfigurer { @resource private apipathproperties apipathproperties; @override public void configurepathmatch(pathmatchconfigurer configurer) { configurer .addpathprefix(apipathproperties.getglobalprefix(),c -> c.isannotationpresent(apirestcontroller.class)) .addpathprefix(apipathproperties.getreportprefix(),c -> c.isannotationpresent(reportrestcontroller.class)); } }
意思是 对有 @apirestcontroller 注解的 controller 添加 /api前缀,对有@reportrestcontroller 注解的controller添加 /api/report 前缀。
@apirestcontroller 和 @reportrestcontroller 是自定义注解继承 @restcontroller注解。
package com.middol.webbase.framework.annotation; import org.springframework.core.annotation.aliasfor; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; import java.lang.annotation.*; /** * controller层统一使用该注解 * @author c西 */ @target(elementtype.type) @retention(retentionpolicy.runtime) @documented @restcontroller @requestmapping public @interface apirestcontroller { /** * alias for {@link requestmapping#name}. */ @aliasfor(annotation = requestmapping.class) string name() default ""; /** * alias for {@link requestmapping#value}. */ @aliasfor(annotation = requestmapping.class) string[] value() default {}; /** * alias for {@link requestmapping#path}. */ @aliasfor(annotation = requestmapping.class) string[] path() default {}; }
然后 你的业务controller 层代码添加 @apirestcontroller 即可,如下:
@api(value = "demouser增删改查接口", tags = "【测试接口】") @apirestcontroller("demouser") public class demousercontroller extends basecontroller{ }
其中 apipathproperties 是统一前缀名称管理,可以在yml中修改,我这里设置了两个 一般的crud接口 /api , 报表服务接口 统一为 /api/report,各自看各自服务定到底设置几个。
package com.middol.webbase.framework.properties; import lombok.data; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.stereotype.component; /** * 接口路径前缀配置 * @author c西 */ @component @configurationproperties(prefix = "api.path") @data public class apipathproperties { string globalprefix = "api"; string reportprefix = "api/report"; }
application.yml文件中添加如下
## 专门针对 controller层接口路径前缀全局配置 api: path: global-prefix: api report-prefix: api/report
springboot项目添加全局前缀
spring的配置
spring.application.name: article (spring boot下无效)
spring boot的配置
(springboot你自己设置的前缀名称)
properties文件
server.servlet.context-path: /springboot
yml文件
server: servlet: context-path: /springboot
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。