基于来自其余控制器的调用切换模式

Switch Schema based on call from rest controller

我们有两个产品:产品 A 和产品 B,它们都有不同的休息控制器。这两个控制器都调用相同的公共服务,而公共服务调用公共 dao 方法。我想 select 通用 daos 方法中的模式基于调用的产品。因此,例如,如果调用来自 Product A 控制器,则 select 架构为 A B.

我想使用相同的数据库连接并根据进行调用的控制器更改架构。一种可能的解决方案是将模式名称从控制器层传递到服务层,服务层又将其传递到 dao 层。我想避免拥有两个不同的数据源然后在它们之间动态切换。

那么有没有其他更好的方法可以做到这一点?

注意:我们使用 Mybatis 作为我们的持久层。

请查找示例代码:

ProductA 的控制器

@Component
public class ProductA{

    private final CommonService commonService;

    public ProductA(CommonService commonService){

            this.commonService = commonService;
    }

    @GET
    @Path("/test/dbSchema")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getTotalProducts(){
        // Calling common service method here to get total products

    }
}

ProductB 的控制器

@Component
public class ProductB{
     private final CommonService commonService;

    public ProductA(CommonService commonService){

            this.commonService = commonService;
    }

    @GET
    @Path("/test/dbSchema")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getTotalProducts(){
        // Calling common service method here to get total products

    }
}

仅供参考:我们正在使用 Jersey

感谢@ave 的回复。正如您提到的,我可以通过使用 ThreadLocal 来解决它。通过在控制器中设置租户ID,我可以在公共服务中获取特定租户。

请在下面找到更新的代码:

产品 A 的控制器

    @Component
    public class ProductA{
    
        private final CommonService commonService;
    
        public ProductA(CommonService commonService){
    
                this.commonService = commonService;
        }
        public void setSchema(){
        TenantContext.setCurrentTenant("ProductA");}
@GET
        @Path("/test/dbSchema")
        @Produces(MediaType.APPLICATION_JSON)
        public Response getTotalProducts(){
             setSchema();
            // Calling common service method here to get total products
    }}

产品 B 的控制器

 @Component
    public class ProductB{
         private final CommonService commonService;
    
        public ProductA(CommonService commonService){
    
                this.commonService = commonService;
        }
        public void setSchema(){
            TenantContext.setCurrentTenant("ProductA");}
    
        @GET
        @Path("/test/dbSchema")
        @Produces(MediaType.APPLICATION_JSON)
        public Response getTotalProducts(){
        setSchema();
            // Calling common service method here to get total products
    
        }
    }