Я прочитал несколько статей, но, к сожалению, не могу извлечь из этого ничего, что помогло бы мне понять основную причину моей проблемы.
В целях обеспечения безопасности и нормативных требований мне пришлось разделить логику моего приложения на два инструмента: один для администрирования и один для «реального» пользовательского приложения.
Поэтому у меня есть два экземпляра баз данных MySQL на сервере версии 5.7. В то время как пользовательский инструмент обращается только к одной базе данных, инструмент администратора должен иметь доступ к объектам в обеих базах данных.
Инструменты основаны как на JavaFX, так и на Spring Boot. Из-за этой архитектурной настройки у меня есть три пакета maven: один для инструмента администратора и все связанные с администратором объекты,
услуги и т.п., один для пользовательского инструмента и всех связанных объектов, служб и т. д., относящихся только к этому пользовательскому инструменту, и третий для всех объектов, которые совместно используются обоими инструментами.
Физически я хочу сохранить эти общие сущности в пользовательской базе данных, так как этот инструмент будет работать с этими данными гораздо чаще, и я верю, что это будет проще для администратора базы данных
поддерживать.
Я попытался выполнить настройку, предложенную в https://www.baeldung.com/spring-data-jpa-multiple-databases часть 6. Несколько баз данных в Spring Boot. Но пока это только частично
успешный. На основании этой статьи у меня есть следующий класс конфигурации в каталоге с классом инструмента администратора:
package com.agiletunes.security;
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
public class MultipleDbConfiguration {
/*
* Persistence of com.agiletunes.security
*/
@Bean
@Primary
@ConfigurationProperties(prefix="security.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
/*
*
* Persistence of com.agiletunes.domain.organization
*/
@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
my application.properties:
# Employee database
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbcUrl=jdbc:mysql://127.0.0.1/agiletunesdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
spring.datasource.username=[aUsername]
spring.datasource.password=[aPassword]
# Account database
security.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
security.datasource.jdbcUrl=jdbc:mysql://127.0.0.1/authenticationdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
security.datasource.username=[aUsername]
security.datasource.password=[aPassword]
# create db schema
spring.jpa.hibernate.ddl-auto=create
#spring.jpa.hibernate.ddl-auto=update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
Первое ограничение заключается в том, что генерируется только схема базы данных security.datasource, а схема spring.datasource - нет.
Другая проблема заключается в том, что при попытке автоматически связать класс обслуживания в общем пакете Maven из класса Controller инструмента администратора я получаю
org.springframework.beans.factory.NoSuchBeanDefinitionException:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.agiletunes.domain.organization.OrganizationService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1506)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:581)
... 21 more
Код соответствующего контроллера:
package com.agiletunes.security.server;
// imports
import com.agiletunes.domain.organization.Employee;
import com.agiletunes.domain.organization.OrganizationService;
import com.agiletunes.security.account.Account;
import com.agiletunes.security.account.AccountService;
...
@Controller
public class AuthServerCtrl implements Initializable {
@Autowired protected AccountService accountService; // works fine
@Autowired protected OrganizationService orgService; // throws Exception
...
}
Код компилируется, поэтому видимость пакетов Maven не является проблемой.
Буду признателен за любую помощь в том, что не так, или за ссылку на документацию, которая описывает, что мне нужно.