Как использовать @ConstructorBinding и @PropertySource вместе с @ConfigurationProperties в Spring Boot 2.2.4?

Я новичок в Spring Boot. В настоящее время я пытаюсь создать класс POJO (SystemProperties.class) для чтения значения в файле свойств (parameter.properties отдельно от application.properties, но все еще в тот же каталог / src / main / resources. Проблема возникает, когда я использую @ConstructorBinding в классе, чтобы он был неизменным.

  • @ConstructorBinding необходимо использовать с @EnableConfigurationProperties или @ConfigurationPropertiesScan.
  • @ConfigurationPropertiesScan игнорирует аннотацию @Configuration, которая необходима при использовании @PropertySource для указания внешнего файла
    * .properties.

A) SystemProperties.class

@Configuration
@PropertySource("classpath:parameter.properties")

@ConstructorBinding
@ConfigurationProperties(prefix = "abc")
public class SystemProperties {

    private final String test;

    public SystemProperties (
            String test) {
        this.test = test;
    }

    public String getTest() {
        return test;
    }

Б) параметр.свойства

abc.test=text1

Я попытался удалить аннотацию @PropertySource, но значение не может быть получено, если оно не находится в application.properties. Любая помощь приветствуется!


person Richard67    schedule 25.02.2020    source источник


Ответы (1)


Способ решить эту проблему - разделить класс на два класса с двумя разными проблемами. С таким решением вы сохраняете созданный вами класс SystemProperties и дополнительно добавляете еще один класс просто для загрузки параметров файла свойств, чтобы сделать их доступными для вашего приложения.

Решение будет таким:

@ConstructorBinding
@ConfigurationProperties(prefix = "abc")
public class SystemProperties {

    private final String test;

    public SystemProperties(
            String test) {
        this.test = test;
    }

    public String getTest() {
        return test;
    }
}

Обратите внимание, что я пропустил аннотации @Configuration и @PropertySource.

@Configuration
@PropertySource("classpath:parameter.properties")
public class PropertySourceLoader {
}

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

Наконец, вы можете добавить @ConfigurationPropertiesScan в свой основной класс приложения, чтобы включить механизм сопоставления свойств.

person Yonatan Wilkof    schedule 25.02.2020
comment
Хороший ответ. Это помогло мне в немного другом, но похожем случае. Также может быть полезна эта статья: baeldung.com/spring-enable-config-properties - person luke; 31.12.2020