Java spring boot中的Api版本控制
我正在尝试基于以下场景进行API版本控制。我有一个名为V1和V2的包,每个包都有自己的控制器和路由映射Java spring boot中的Api版本控制,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我正在尝试基于以下场景进行API版本控制。我有一个名为V1和V2的包,每个包都有自己的控制器和路由映射 @RequestMapping(path = "api/v${ApiVersion}/product") public class ProductController {} 在application.yml中,我有以下配置: ApiVersion:1 spring: profiles: active: dev server: port: 8083 Api
@RequestMapping(path = "api/v${ApiVersion}/product")
public class ProductController {}
在application.yml中,我有以下配置:
ApiVersion:1
spring:
profiles:
active: dev
server:
port: 8083
ApiVersion: 1
我想做的是:
http://192.168.1.101:8083/api/v1/product
http://192.168.1.101:8083/api/v2/product
有可能实现吗?理想情况下,每个版本都应该有不同的控制器,并相应地调用服务。例如:
@RestController
@RequestMapping(path = "api/v1/product")
public class ProductController {
}
@RestController
@RequestMapping(path = "api/v2/product")
public class ProductController {
}
但如果您想保留一个控制器,可以这样做:
@RestController
@RequestMapping(path = "api/v{apiVersion}/product")
public class ProductController {
@GetMapping("{id}")
public Product getById(@PathVariable Integer apiVersion,
@PathVariable Integer id) {
if(apiVersion == 1) {
//invoke bersion 1 service
}
else if(apiVersion == 2) {
//invoke bersion 2 service
}
else{
//throw exception for invalid version
}
}
}
您不需要在
应用程序中设置任何内容。属性
这是否回答了您的问题?在属性文件中包含该版本,您试图实现什么目标?您已经在软件包编号中硬编码了版本,您还可以为每个控制器中的路径硬编码。如果您使用属性文件中的变量来填充路径(如示例中所示),则两个控制器都将指向v1。@dozerman-是的,您是100%正确的。我的要求是,当我在URL中使用version-V1时,它应该从V1包中获取控制器,反之亦然。对于V2@SanJaisy,您不需要在属性中使用该版本。只需构建两个硬编码映射(v1和v2各一个),每个请求将根据其版本进行处理。但是RequestMapping无法在需要从application.properties文件筛选的控制器上硬编码。