2013-07-05 2 views
7

Я ранее использовал класс устаревших классов org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer, чтобы загрузить файл свойств из файловой системы сервера. Я следующий боб определяемом:Tomcat Context-Params игнорируется в Spring Webapp при использовании PropertyPlaceholder

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="locations" value="${config}"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="searchContextAttributes" value="true"/> 
    <property name="contextOverride" value="false"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="searchSystemEnvironment" value="false"/> 
</bean> 

config является аргумент, который передается при запуске Tomcat, т.е.

-Dconfig=/path/to/application.properties 

Для веб-приложение У меня также есть файл контекста:

<Context docBase="/path/to/application.war"> 
    <Parameter name="host" value="localhost" override="false"/> 
    <Parameter name="port" value="8080" override="false"/> 
</Context> 

Если файл .properties, заданный аргументом -Dconfig, содержит свойство, которое ссылается на некоторые другие bean-компоненты, а затем значение из .properties используется файл, в противном случае используется значение из XML-файла контекста.

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

Теперь я обновляю, чтобы использовать новые абстракции свойств весной 3.1, но я не могу понять, что эквивалентный подход к этому?

У меня есть один и тот же файл контекст и войны развернутых таким же образом, и теперь у меня есть следующий в заявке:

<context:property-placeholder 
     location="${config}" 
     system-properties-mode="OVERRIDE" 
     ignore-resource-not-found="true" 
     ignore-unresolvable="true"/> 

Это находит и использует свойства из файла свойств, но это не используйте значения из XML-файла контекста.

Как получить мое приложение для использования параметров контекста при использовании этого нового владельца-заполнителя?

Спасибо.

ответ

4

Подводя итог, следует отметить, что параметры контекста из файла контекста сервлета не использовались для разрешения заполнителей при использовании нового пространства имен Property Placeholder, введенного в Spring 3.1.

я понял, решение, со следующими

<context:property-placeholder location="${config}" local-override="true" ignore-resource-not-found="true"/> 

можно указать один или несколько * .properties файлов в локальной файловой системе с помощью виртуальной машины Java ARG, например:

-Dconfig=/path/app.properties 

Если свойство placeholder не может быть разрешено после проверки файла app.properties, тогда проверяются параметры контекста сервлета.

Это позволяет мне иметь значения по умолчанию с использованием параметров контекста в файле web.xml и где мне нужно переопределить эти значения, указав расположение файлов * .properties с помощью аргумента JVM arg config.

Ключом к тому, чтобы заставить его работать таким образом, было включение local-override="true", что по умолчанию является ложным. Я не совсем уверен, что это имеет смысл, поскольку описание для этого атрибута:

Указывает, переопределяют ли локальные свойства свойства из файлов. По умолчанию «false»: свойства из файлов переопределяют локальные значения по умолчанию.

Если же ключевое свойство существует в app.properties и web.xml значение из app.properties используется.

1

Spring использует файл свойств по умолчанию, если не задан пользовательский файл свойств. Если вы хотите контролировать файл .properties, следуйте инструкциям, опубликованным here.

Если вы хотите воспользоваться преимуществами application.properties, есть два способа сделать это.

<!-- allows for ${} replacement in the spring xml configuration from the 
    system.properties file on the classpath --> 
<util:properties id="appProperties" location="classpath:application.properties"/> 
<context:property-placeholder location="classpath:application.properties"/> 

тег util позволяет использовать класс свойств для чтения свойств в приложении. Например:

@Autowired 
public MyPropertyReader(Properties appProperties) { 
    String prop1 = appProperties.getProperty("my.address"); 
    String prop2 = appProperties.getProperty("my.version"); 
} 

Если вы хотите использовать значения в своем контекстном файле, используйте тег context-propertyholder. Затем вы можете использовать в качестве значения

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="${jms.primary.server}"/> 

, где, например jms.primary.server = 172.168.10.18: 6161 в application.properties.

+0

Я не думаю, что вы полностью поняли мое первоначальное сообщение. Я уже заполнил заполнители, используя файл свойств. Вопрос задает вопрос об использовании параметров контекста. – C0deAttack

+0

Вы следили за ссылкой с 1-го предложения? Остальная часть ответа - это просто дополнение для других разработчиков, которые используют .properties и application.properties. – luksmir

+0

Вопрос касается параметров контекста - не файлов свойств. – C0deAttack

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