Дублировать `@ConfigurationProperties` в двух разных профилях

#java #spring-boot

#java #весенняя загрузка

Вопрос:

Почему я не могу определить два компонента с одинаковым configurationProperties префиксом? Приведенный ниже код выдает следующую ошибку:

 Duplicate `@ConfigurationProperties` definition for prefix 'config'
  

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

 @Profile("MyProfile")
@Bean(initMethod = "init", name = "MyConfig")
@ConfigurationProperties(prefix = "config")
public MyConfig config() {
    MyConfig config = new MyConfig();
    return config;
}

@Profile("!MyProfile")
@Bean(initMethod = "anotherInit", name = "MyConfig")
@ConfigurationProperties(prefix = "config")
public MyConfig myConfig() {
    MyConfig config = new MyConfig();
    return config;
}
  

Обновить:

[ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins:maven-compiler-plugin:3.8.1:компиляция (по умолчанию-compile) в проекте my-app: Сбой компиляции: Сбой компиляции:

[ОШИБКА] …MyConfig.java :[21,22] Дублировать @ConfigurationProperties определение для префикса ‘config’

Комментарии:

1. Я хочу получить разные компоненты по профилю с одинаковым префиксом конфигурации, например, с тем же префиксом базы данных, но для двух разных компонентов, таких как hikariDataSource и AtomikosDataSource

2. какая это версия Spring boot?

3. версия 2.3.3.ВЫПУСК

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

5. нет, на самом деле это не проблема IDE. Я обновил вопрос с ошибкой компиляции

Ответ №1:

Как упоминалось в вашем комментарии, эта ошибка времени компиляции вызвана обработчиком аннотаций — spring-boot-configuration-processor .

Как он решает , существуют ли повторяющиеся свойства конфигурации ?

Он решает 2 вещи —

  1. Префикс свойства
  2. Имя класса конфигурации / возвращаемый тип метода

Обратите внимание, что имя профиля Spring не является частью поиска дубликатов. Итак, обе конфигурации похожи. Это вызывает ошибку времени компиляции.

Решение

Либо вы вызываете ошибку в spring api, либо делаете что-то, что делает эти 2 свойства разными. Один из способов, и я думаю, что единственный способ — создать новый класс конфигурации, который расширяет исходный. Это гарантирует, что они не будут рассматриваться как дубликаты.

 class SomeOtherProfileConfig extends MyConfig {
}

@Profile("MyProfile")
@Bean(initMethod = "init", name = "MyConfig")
@ConfigurationProperties(prefix = "config")
public MyConfig config() {
    MyConfig config = new MyConfig();
    return config;
}

@Profile("!MyProfile")
@Bean(initMethod = "anotherInit", name = "MyConfig")
@ConfigurationProperties(prefix = "config")
public SomeOtherProfileConfig myConfig() {
    SomeOtherProfileConfig config = new SomeOtherProfileConfig();
    return config;
}
  

Комментарии:

1. Есть ли другое решение? В моем случае я не могу расширять классы, потому что они находятся в разных модулях

Ответ №2:

Вы можете объявить один класс для @ConfigurationProperties , свойства будут выбраны из файла свойств активного профиля. Затем вы можете использовать свойства в разных компонентах с @EnableConfigurationProperties

Комментарии:

1. хм, я не могу использовать EnableConfigurationProperties, потому что, как вы видите в моем вопросе, существует также метод init, и я не думаю, что вы можете использовать метод init с этой аннотацией