2017-02-20 21 views
2

Я развертываю приложение Spring Boot как WAR-файл в Tomcat. Я ожидал, что мои application-local.properties переопределяют значения, которые также существуют в моем файле application.properties. Но кажется, что значения из application-local.properties считываются только в том случае, если эти ключи не существуют в application.properties. Мой application.properties файл находится в SRC/основные/ресурсы/моего проекта и application-local.properties находится в $ {catalina.home}/property_files/ком/демо/конфигурации папкиSpring @PropertySources значение не переопределяет

context.xml

<Parameter name="spring.profiles.active" value="local" override="false"/> 

catalina.properties

shared.loader=${catalina.home}/property_files 

AppConfig.java

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("classpath:com/demo/config/application-${spring.profiles.active}.properties") 
}) 
public class AppConfig extends WebMvcConfigurerAdapter { 
} 

EDIT 1: На самом деле загружается файл свойств, зависящий от среды. Но он не отменяет никаких значений из внутреннего файла свойств.

EDIT 2: Спасибо за все ваши предложения. Но я обнаружил, что моя проблема была вызвана приоритетом каталога. Оказывается, что файлы свойств в корневом пути к классам имеют более высокий приоритет, чем любые файлы свойств независимо от того, в каком порядке они объявлены.

+0

В принципе, я просто хочу, чтобы использовать SRC/основные/ресурсы/application.properties для местного где значения могут быть переопределены другим файлом свойств в другой среде (интеграция dev, QA, uat, production). –

ответ

2

Вместо того, чтобы использовать многие propertySource аннотацию попытайтесь установить при запуске приложения

Java -jar myproject.jar --spring.config.location = {your_location} /application.properties,classpath : /override.properties.

Независимо от того, что вы предоставляете как часть командной строки, будет иметь самый высокий приоритет .
Или делать что-то подобное и испытание

@Configuration 
@PropertySource("classpath:application.properties") 
public class DefaultConfiguration {} 
@Configuration 
@PropertySource("classpath:{environment_specific_property_name}.properties") 
public class EnvironmentSpecific{ 

    @Configuration 
    @Import(DefaultConfiguration .class) 
    static class Configuration {} 

} 
+0

. Хорошая практика - удалить весь файл свойств из пути к классам и сохранить его в {specific_config_location} и предоставить местоположение весне во время запуска сервера, как я уже упоминал ранее. – user121290

+0

Собственно, мое свойство, зависящее от среды файл загружается. Но он не отменяет никаких значений из внутреннего файла свойств. –

+0

Я отредактировал ответ. Пожалуйста, проверьте это. :) – user121290

0

Должен быть:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("file:${catalina.home}/property_files/com/demo/config/application-${spring.profiles.active}.properties") 
}) 
public class AppConfig extends WebMvcConfigurerAdapter { 
} 

Непроверено

+1

Это не сработало. Я считаю, что файл зависимого от профиля профиля уже был добавлен в путь к классам, когда я объявил shared.loader = $ {catalina.home}/property_files мои свойства catalina.properties. На самом деле, я не сталкиваюсь с какой-либо проблемой, когда удаляю любую противоречивую запись в application.properties. Я просто ожидал, что те же ключи будут переопределены. –

0

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

<!--load from external file first--> 
<context:property-placeholder order="1" ignore-resource-not-found="true" 
     location="file:/path_to/your_app/application.properties" ignore-unresolvable="true"/> 
<!--load any properties not found in file from class path--> 
<context:property-placeholder order="2" 
     location="classpath:application.properties" ignore-unresolvable="true"/> 
0

вы можете использовать:

@Configuration 
@PropertySources({ 
    @PropertySource("classpath:application.properties"), 
    @PropertySource("file:${catalina.base}/property_files/com/demo/config/application-${spring.profiles.active}.properties") 
}) 
public class AppConfig extends WebMvcConfigurerAdapter { 
} 

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

+2

На самом деле загружается файл свойств, зависящий от среды. Но он не отменяет никаких значений из внутреннего файла свойств. –

0

Спасибо за все ваши предложения. Но я обнаружил, что моя проблема была вызвана приоритетом каталога. Оказывается, что файлы свойств в корневом пути пути имеют более высокий приоритет, чем любые файлы свойств независимо от того, в каком порядке они объявлены.

0

Вместо свойств application.properties поместите конфигурацию/свойства по умолчанию в другой файл. По-видимому, значения свойств, определенные в application.properties, имеют наивысший приоритет.

Так, что-то, как это будет работать:

@Configuration 
@PropertySource("classpath:application-env.properties") 
@PropertySource(value="file:${application.home}/application-env.properties",ignoreResourceNotFound=true) 
public class GlobalSettings { 
    //configuration values 
} 

Испытано в Spring 4.x и Java 8

 Смежные вопросы

  • Нет связанных вопросов^_^