Свойство Spring Boot из application.properties не загружено в @Value в классе @Configuration - PullRequest
0 голосов
/ 16 января 2020

В проекте Spring-Boot 2.2.0 и Java8.

У меня есть некоторые свойства в моем application- (profileActive) .properties (так, на войне), которые я хочу вывести на внешний конфигурационный файл (вне войны). Это связано с тем, что эти свойства изменяются раз в полгода, и их удобнее хранить в виде простых текстовых файлов (я могу использовать команду sed и т. Д. c).

Необходимо указать расположение файлов изменяемых свойств. в приложении- (profileActive) .properties (изменяется в зависимости от среды) в свойстве mutableproperties.project. root

Я ищу решение, с помощью которого в рамках всего проекта все @Value продолжает работать, как будто ничего не происходит (после перезапуска).

Я пытаюсь загрузить эти свойства для одного файла, используя класс ниже:

@Configuration
public class MutableProperties {

    @Value("${mutableproperties.project.root}")
    private String mutablePropertiesRoot;

    private String configFile(String type) {
        StringBuffer file = new StringBuffer(mutablePropertiesRoot).append(File.pathSeparatorChar);
        file.append(type).append(".properties");
        return file.toString();
    }

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurerDb() {
        PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
        properties.setLocation(new FileSystemResource(configFile("db")));
        properties.setIgnoreResourceNotFound(false);
        return properties;
    }

}

Проблема изменчива Root равно null (и оно присутствует во всех приложениях (profileActive) .properties) как:

mutableproperties.project.root=/etc/properties/boot/myproject

Я пробовал с stati c PropertySourcesPlaceholderConfigurer, но он не подходит поскольку имя файла на самом деле является динамическим c.

Я открыт для других решений для решения проблемы, но изменения в JVM или действиях во многих классах не подходит. Это должно быть хирургическое изменение, которое будет работать в уже производственной среде

1 Ответ

0 голосов
/ 20 января 2020

Я наконец-то отказался от @Value в Configuration.

Решением было свойство в профиле maven (так что свойство не жестко запрограммировано, оно в pom), пусть maven создайте файл свойств в пути, указанном в этом свойстве, используя org.codehaus.mojo.properties-maven-plugin.

При этом:

  1. Я генерирую динами c файл свойств (недоступен для затмения, только на войне), включенный maven в войну
  2. В нем есть свойство, путь к которому лежит редактируемый файл свойств
  3. Из PropertySourcesPlaceholderConfigurer Теперь я могу загрузить все свойства. И да, имена файлов свойств жестко запрограммированы, так как application.properties не является проблемой

private stati c final String FROMPOM_PROPERTIES_LOCATION = " /frompom.properties";

личное состояние c final String MUTABLES_ROOT_PROPERTY = "mutable. root";

private String mutablesLocation() throws ...{
    Resource resource = new ClassPathResource("/frompom.properties");
    return PropertiesLoaderUtils.loadProperties(resource).getProperty("mutable.root");
}

private PropertySourcesPlaceholderConfigurer configurer(String type) {
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
    File file = new File("/" + mutablesLocation() + "mutable.properties");
    properties.setLocation(new FileSystemResource(file));
    return properties;
}

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>write-project-properties</goal>
            </goals>
            <configuration>
                <outputFile>${project.build.outputDirectory}\frompom.properties</outputFile>
            </configuration>
        </execution>
    </executions>
</plugin>
...