Spring-Boot: Как ограничить видимость Бобов - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть два пользовательских PlatformTransactionManager bean-компонента, внедренных в среду Spring с определенным names следующим образом:

@Bean(name = "ubldbTransactionManager")
protected PlatformTransactionManager transactionManager(
        @Qualifier("ubldbEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
}

@Bean(name = "bpdbTransactionManager")
public PlatformTransactionManager bpdbTransactionManager(
        @Qualifier("bpdbEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
}

Сторонняя библиотека имеет зависимость @Autowired protected PlatformTransactionManager transactionManager;.Таким образом, сторонняя библиотека не должна использовать ни один из двух TransactionManagers.Однако, как вы видите, Qualifier для внедрения зависимостей во внешней библиотеке нет, и я получаю сообщение об ошибке следующим образом:

Field transactionManager in org.camunda.bpm.spring.boot.starter.configuration.impl.DefaultDatasourceConfiguration required a single bean, but 2 were found:
    - bpdbTransactionManager: defined by method 'bpdbTransactionManager' in class path resource [eu/nimble/service/bp/config/BusinessProcessDBConfig.class]
    - ubldbTransactionManager: defined by method 'transactionManager' in class path resource [eu/nimble/service/bp/config/UBLDBConfig.class]

Итак, как я могу ограничить видимость двух Beansчтобы они не были доступны сторонней библиотеке?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

DefaultDatasourceConfiguration предоставляется для использования стандартных бобов Spring, например DataSource с именем dataSource и PlatformTransactionManager с именем transcationManager. Именно там можно приклеить Camunda к приложению Spring Boot, которое по умолчанию имеет единственный источник данных.

Поскольку вы создали собственные PlatformTransactionManager bean-компоненты, этот отключенный bean-компонент диспетчера транзакций Spring Boot по умолчанию называется transcationManager (согласно TransactionAutoConfiguration Логика автоматической конфигурации Spring Boot).

Скорее всего, вам нужно определить еще один transactionManager (и, возможно, dataSource) для механизма процессов Камунды, для которого требуется собственная схема. Обязательно используйте правильное имя бина, как показано ниже:

@Bean
public PlatformTransactionManager transactionManager() {
  ...
}

Начиная с Spring 4, имя бина является квалификатором по умолчанию при автоматическом подключении, поэтому новый менеджер транзакций будет подключен к DefaultDatasourceConfiguration, так как он соответствует имени поля в классе.

В качестве альтернативы не используйте DefaultDatasourceConfiguration и разверните свою собственную конфигурацию, если настройки Spring Boot не работают для вас.

0 голосов
/ 19 ноября 2018

Использовать аннотацию @Qualifier Аннотация @Qualifier используется для разрешения конфликта автоматической разводки, когда существует несколько бинов одного типа.

@Bean
@Qualifier("ubldbTransactionManager")
protected PlatformTransactionManager transactionManager

и

@Bean
@Qualifier("bpdbTransactionManager")
public PlatformTransactionManager bpdbTransactionManager
...