Java 定义Spring AOP后无法切换数据库

Java 定义Spring AOP后无法切换数据库,java,spring-boot,hibernate,multi-tenant,Java,Spring Boot,Hibernate,Multi Tenant,我正在研究一个多租户体系结构,我们必须处理数据库的动态创建和切换 我面临的问题是,我在AOP级别编写了切换数据库的全部代码,而在控制器或服务级别,我无法进行另一次切换 AOP类 /** *类型Api util。 */ @面貌 @组成部分 @订单(2) 公共类APIUtil{ 私有静态最终记录器log=LoggerFactory.getLogger(APIUtil.class); 私立最终校长服务学校校长服务; /** *实例化一个新的Api util。 * *@param schoolMaste

我正在研究一个多租户体系结构,我们必须处理数据库的动态创建和切换

我面临的问题是,我在AOP级别编写了切换数据库的全部代码,而在控制器或服务级别,我无法进行另一次切换

AOP类

/**
*类型Api util。
*/
@面貌
@组成部分
@订单(2)
公共类APIUtil{
私有静态最终记录器log=LoggerFactory.getLogger(APIUtil.class);
私立最终校长服务学校校长服务;
/**
*实例化一个新的Api util。
*
*@param schoolMasterService学校校长服务
*@param-helperService
*/
公共APIUtil(学校管理服务学校管理服务){
this.schoolMasterService=schoolMasterService;
}
/**
*围绕控制器方法对象。
*
*@param proceedingJoinPoint正在进行的连接点
*@返回对象
*@扔,扔,扔,扔
*/
@围绕(“执行(*com.example.board.controller.*.*(..)”)
围绕ControllerMethods(ProceedingJoinPoint ProceedingJoinPoint)的公共对象抛出可丢弃的{
log.info(“所有学校已加载!”);
TenantContext.setCurrentTenant(默认租户ID);
schoolMasterService.findAllMasters();
HttpServletRequest请求=((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
字符串tenantID=request.getHeader(XTENANTID.trim();
返回过滤器引导器(tenantID,proceedingJoinPoint);
}
私有对象filterByHeader(字符串tenantID,ProceedingJoinPoint-joinPoint)抛出Throwable{
SchoolMaster-SchoolMaster=schoolMasterService.findBySchoolId(Long.parseLong(tenantID));
log.info(格式(“当前学校为%s”,schoolMaster.getDataSourceKey());
setCurrentTenant(schoolMaster.getDataSourceKey());
返回joinPoint.procedure();
}
}
CurrentTenantIdentifierResolverImpl类

@组件
公共类CurrentTenantIdentifierResolverImpl实现CurrentTenantIdentifierResolver{
私有最终记录器Logger=LoggerFactory.getLogger(getClass());
@凌驾
公共字符串resolveCurrentTenantIdentifier(){
字符串currentDataSourceKey=TenantContext.getCurrentTenant();
if(Objects.isNull(currentDataSourceKey)){
currentDataSourceKey=默认租户ID;
}
调试(“currentDataSourceKey{}”,currentDataSourceKey);
返回currentDataSourceKey;
}
@凌驾
公共布尔值validateExistingCurrentSessions(){
返回true;
}
}
MultiTenantConnectionProviderImpl类

@组件(MultiTenantConnectionProviderImpl.BEAN\u ID)
公共类MultiTenantConnectionProviderImpl扩展了基于抽象数据源的MultiTenantConnectionProviderImpl{
/**
*常量BEAN\u ID。
*/
公共静态最终字符串BEAN_ID=“multiTenantConnectionProvider”;
私有静态最终长serialVersionUID=73953183153512114572L;
@自动连线
私人租户数据源租户数据源;
私人日志记录器;
/**
*实例化新的多租户连接提供程序。
*/
公共多租户连接提供程序empl(){
log=LoggerFactory.getLogger(getClass());
}
@凌驾
受保护的数据源selectAnyDataSource(){
debug(“selectAnyDataSource,返回dafault-tenantid”);
返回tenantDataSource.getDataSource(默认租户ID);
}
@凌驾
受保护的数据源selectDataSource(字符串租户标识符){
debug(“选定的数据源{}”,租户标识符);
返回tenantDataSource.getDataSource(tenantIdentifier);
}
}
租户数据源类

@组件
公共类租户数据源{
私有最终映射租户数据源smap=new HashMap();
私有最终记录器log=LoggerFactory.getLogger(TenantDataSource.class);
私有最终数据源属性数据源属性;
私有最终数据源数据源;
私有最终JdbcTemplate jdbcTemplateObject;
/**
*实例化新租户数据源。
*
*@param properties属性
*@param-source源
*@param object对象
*/
公共租户数据源(数据源属性、数据源源、JdbcTemplate对象){
this.dataSourceProperties=属性;
this.dataSource=source;
this.jdbcTemplateObject=object;
}
/**
*将默认数据源添加到映射。
*/
@施工后
void addDefaultDatasourceToMap(){
tenantDataSourcesMap.put(默认租户ID,数据源);
}
/**
*获取数据源。
*
*@param dataSourceName数据源名称
*@返回数据源
*/
公共数据源getDataSource(字符串数据源名称){
DataSource currentDatasource=null;
调试(“getDataSource().dataSourceName{}”,dataSourceName);
if(租户数据源映射containsKey(数据源名称)){
currentDatasource=(DataSource)tenantDataSourcesMap.get(dataSourceName);
}
返回当前数据源;
}
/**
*加载租户布尔值。
*
*@param tenantDatasource租户数据源
*@返回布尔值
*/
公共布尔加载租户(校长租户数据源){
试一试{
如果(!verifyPort(租户数据源))
返回false;
DataSource temp=createDataSource(租户数据源);
布尔结果=验证连接(温度);
如果(结果){
tenantDataSourcesMap.putIfAbsent(tenantDatasource.getDataSourceKey(),temp);
}
返回结果;
}捕获(异常h){
    logger.info("getSyllabusByBoardId Method called in BoardManagement...");
    log.debug("selectAnyDataSource , returning dafault tenantid");
   log.debug("selected Datasource {} ", tenantIdentifier);