Ошибка: зависимости некоторых компонентов в контексте приложения образуют цикл.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ошибка: зависимости некоторых компонентов в контексте приложения образуют цикл.

Сообщение Anonymous »

Я реализую мультитенантную архитектуру в своем приложении Spring. Класс ConfigurationDataSource используется для предоставления источника данных при запуске приложения. Ниже приведена подробная реализация класса:

Код: Выделить всё

ConfigurationDataSource

Код: Выделить всё

import com.example.hikaricp_demo.domain.TenantConfig;
import com.example.hikaricp_demo.repository.TenantConfigRepository;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Configuration
public class ConfigurationDataSource {

@Autowired
private TenantConfigRepository repository;

private List getListTenant(){
return repository.findAll();
}

TenantConfig tenantDefault() {
return repository.findByTenantId("tenantDefault");
}

@Bean
public DataSource dataSource() {
Map resolvedDataSources = new HashMap();
List listTenant = getListTenant();

for (TenantConfig item : listTenant) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(item.getDriverClassName());
hikariConfig.setJdbcUrl(item.getUrl());
hikariConfig.setUsername(item.getUsername());
hikariConfig.setPassword(item.getPassword());
hikariConfig.setSchema(item.getSchema());

HikariDataSource dataSource = new HikariDataSource(hikariConfig);
resolvedDataSources.put(item.getTenantId(), dataSource);
}

AbstractRoutingDataSource dataSource = new MultiTenantDataSource();
dataSource.setDefaultTargetDataSource(tenantDefault());
dataSource.setTargetDataSources(resolvedDataSources);
dataSource.afterPropertiesSet();
return dataSource;
}
}
TenantConfigRepository — это JPA-репозиторий Spring Data, который взаимодействует с базой данных для получения конфигураций клиента. Когда я запускаю приложение, я получаю следующую ошибку:

Код: Выделить всё

Description:

The dependencies of some of the beans in the application context form a cycle:

entityManagerFactory defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]
┌─────┐
|  dataSourceScriptDatabaseInitializer defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]
↑     ↓
|  configurationDataSource (field private com.example.hikaricp_demo.repository.TenantConfigRepository com.example.hikaricp_demo.config.ConfigurationDataSource.repository)
↑     ↓
|  tenantConfigRepository defined in com.example.hikaricp_demo.repository.TenantConfigRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration
↑     ↓
|  jpaSharedEM_entityManagerFactory
└─────┘
Я подозреваю, что это происходит потому, что:
Компонент dataSource зависит от TenantConfigRepository (для получения конфигураций арендатора с помощьюrepository.findAll()) .
TenantConfigRepository также может зависеть от DataSource, создавая циклическую зависимость.

Подробнее здесь: https://stackoverflow.com/questions/792 ... t-form-a-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»