Как работать с несколькими базами данных MySQL из одного приложения весенней загрузки? - PullRequest
0 голосов
/ 11 января 2019

Я прочитал несколько статей, но, к сожалению, не могу извлечь из этого ничего, что помогло бы мне понять основную причину моей проблемы.

В целях обеспечения безопасности и нормативных требований мне пришлось разделить логику моего приложения на два инструмента: один для администрирования и один для «реального» пользовательского приложения. Поэтому у меня есть два экземпляра баз данных 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 не является проблемой.

Буду признателен за любую помощь в том, что не так, или за ссылку на документацию, которая описывает, что мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...