基于来自其余控制器的调用切换模式
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
}
}
我们有两个产品:产品 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
}
}