Arhn - архитектура программирования

Spring boot application.properties повторно использует значения

Мой вопрос кажется довольно простым, но я не смог найти способ его реализовать.

Рассмотрим следующий случай:

prop1 = value1
prop2 = value2
prop3 = value3

prop4 = value2     (Value same as prop2)
prop5 = value3     (Value same as prop3)

Как повторно использовать значения 2 и 3 (на самом деле это свойства, специфичные для базы данных), поскольку я хочу, чтобы пользователь предоставлял их только один раз, а не повторял.

Спасибо.

Случай 1: я бы развил свой случай следующим образом: у меня есть два файла свойств - application.properties и quartz.properties.

приложение.свойства:

prop1 = value1
prop2 = value2
prop3 = value3

кварц.свойства

prop4 = value2     (Value same as prop2)
prop5 = value3     (Value same as prop3)

Обратите внимание: я не могу объединить содержимое двух файлов свойств, и они почему-то помещаются отдельно.

В обычном сценарии я ожидал, что ${} будет работать, но я думаю, что это не работает, когда свойства находятся в двух разных файлах.

Случай 2: [Простой сценарий] Я попытался использовать только один файл application.properties. Но даже тогда я не могу повторно использовать значения свойств в одном и том же файле свойств.

Мой пом.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.abc</groupId>
    <artifactId>abc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>xyz</name>
    <description>xyz</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <!-- Quartz dependencies start -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>

        <!-- Includes spring's support classes for quartz -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

        <!-- Quartz dependencies End -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

  • Не уверен, что правильно вас понял. prop4 = ${prop2} возможно 19.06.2017
  • Спасибо, Джон. Я тоже думал, что это сработает, но это не так :( 19.06.2017
  • Тогда вы могли бы просто использовать ${prop2} везде, где вам это нужно, зачем вообще иметь этот prop4? 19.06.2017
  • Имена свойств различаются, и они не могут называться одинаково. 19.06.2017
  • @sauveerpandey Не могли бы вы поделиться своим pom.xml и структурой вашего проекта... 19.06.2017
  • Код @VelNaga pom.xml обновлен в моем вопросе. Для структуры проекта это простое приложение Spring Boot с application.properties в обычном каталоге src/main/resources. Конечно, он работает правильно для всех свойств, но, как уже было сказано, я хочу повторно использовать некоторые значения. 19.06.2017
  • Как упомянул @john, это должно работать... Не могли бы вы удалить зависимость Quartz и проверить... также spring-context-support 19.06.2017
  • Что интересно, это работает, когда зависимости Quartz имеют фактические значения, а имена свойств кварца используются в качестве заполнителей. Это работает org.quartz.dataSource.myDS.user =username org.quartz.dataSource.myDS.password = password spring.datasource.username = ${org.quartz.dataSource.myDS.user} spring.datasource.password = ${org.quartz.dataSource.myDS.password} Не работает spring.datasource.username=username spring.datasource.password = password org.quartz.dataSource.myDS.user = ${spring.datasource.username} org.quartz.dataSource.myDS.password =${spring.datasource.password} 19.06.2017
  • @sauveerpandey здесь имеет значение приоритет свойств. Таким образом, Spring отдает больший приоритет кварцу.свойствам, чем application.properties.Если вы хотите использовать другой способ, вы можете указать spring.datasource.username и spring.datasource.password в bootstrap.properties, а затем вы можете сослаться на эти свойства вquart.properties. 19.06.2017
  • @VelNaga Я думаю, ты прав. Спасибо. 20.06.2017

Ответы:


1

Вы можете использовать заполнитель для него следующим образом:

prop1 = value1
prop2 = value2
prop3 = value3

prop4 = ${prop2}     (Value same as prop2)
prop5 = ${prop3}     (Value same as prop3)

Но обратите внимание, что это должно быть в application.properties, чтобы Spring знал об этом. Если вам нужен собственный файл со свойствами, имеет смысл настроить PropertyPlaceholderConfigurer, как показано ниже:

@Configuration
public class PropertyPlaceholderConfigurerConfig {

    @Bean
    public static PropertyPlaceholderConfigurer ppc() throws IOException {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(new ClassPathResource("custom.properties"));
        ppc.setIgnoreUnresolvablePlaceholders(true);
        return ppc;
    }
}

Теперь вы должны уметь:

@Value("${prop4}")
private String someValue;

И он должен ввести вам правильное значение в ваш компонент.

19.06.2017
  • prop4 = ${значение2} ?? или вы имели в виду prop4 = ${prop2} ? 19.06.2017
  • да, я ошибся 19.06.2017
  • Я предполагаю, что это связано с тем, что Spring не знает о вашем файле свойств. Чтобы узнать об этом, попробуйте использовать PropertyPlaceholderConfigurer, как я только что добавил к ответу. 19.06.2017
  • Для быстрого теста я поместил все свойства в один файл application.properties (и, конечно, Spring знает об этом). Даже тогда prop4 = ${prop2} не работает. Я не хочу добавлять какой-либо код конфигурации и обрабатывать только файл свойств. 19.06.2017
  • Это странно. Я попытался создать тестовый проект, в котором я использую заполнители точно так же, и это сработало для меня. 19.06.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..