Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring boot中的Api版本控制_Java_Spring_Spring Boot_Spring Security - Fatal编程技术网

Java spring boot中的Api版本控制

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

我正在尝试基于以下场景进行API版本控制。我有一个名为V1V2的包,每个包都有自己的控制器和路由映射

@RequestMapping(path = "api/v${ApiVersion}/product")
public class ProductController {}
在application.yml中,我有以下配置:

ApiVersion:1

spring:
  profiles:
    active: dev
server:
  port: 8083

ApiVersion: 1

我想做的是:

  • 如果URL有V1(ApiVersion:1),那么它应该路由到V1控制器
    http://192.168.1.101:8083/api/v1/product
  • 如果URL有V2(ApiVersion:2),那么它应该路由到V2控制器
    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文件筛选的控制器上硬编码。