Добавьте свойства к заполнителю свойства - PullRequest
5 голосов
/ 17 июня 2011

У меня есть приложение, в котором заполнитель свойств используется для чтения свойств, настроенный в applicationContext.xml:

...
<context:property-placeholder
     location="classpath*:META-INF/spring/*.properties"/> 
...

Приложение запускается в Tomcat и использует параметр, определенный в context.xml. Приложение обращается к этому параметру как обычные свойства (@Value(${cfma.applicationUrl})). Это работает

В моих тестовых случаях у меня нет свойств tomcat, поэтому я хочу добавить их «вручную» в контекст приложения. Но также загрузить нормальный applicationContext.xml

testContext.xml:

<import resource="classpath:/META-INF/spring/applicationContext.xml" />
<context:property-placeholder properties-ref="simulatedTomcatProperties"/>
<util:properties id="simulatedTomcatProperties">
   <prop key="cfmt.applicationBaseUrl">localhost:8080/cfmt</prop>
</util:properties>

Теперь у меня есть два контекста: свойство-заполнитель, и это не работает (конечно) - Итак, мой вопрос: кто может расширить свойства в «обычном» свойстве-заполнителе в моем тесте?


Подробнее о том, что мне нужно:

  • Продуктивная среда (а также среда разработки) определяет некоторые свойства с помощью параметра Tomcat. Поэтому они не включены ни в один файл свойств, но, к сожалению, к ним можно получить доступ как к обычным свойствам (@Value(${cfma.applicationUrl})). Более того, не должно быть никакого Fallback, если свойства не определены в Tomcat, приложение не должно запускаться!
  • В тестовых примерах (использующих контекст весны) я должен кое-как вставить свойство (cfma.applicationUrl), чтобы его можно было вставить в аннотированные переменные. Но если я добавлю второй context:property-placeholder, они не будут объединены:

@ См. Комментарии к https://jira.springsource.org/browse/SPR-4881 - они объясняют это поведение.


Когда я говорю о параметре Tomcat, я говорю о чем-то вроде этого:

context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Parameter name="cfmt.applicationBaseUrl"
          value="http://localhost/demoApp" override="false"/>
</Context>

Ответы [ 4 ]

5 голосов
/ 18 июня 2011

Не уверен, поможет ли это, но в аналогичной ситуации я делаю, что у меня есть 2 файла app.properties с одинаковым именем, один в sec / test / resources, а другой в src / main / resources. Теперь во время тестирования первый загружается, потому что тестовые классы сначала находятся на пути к классам, но когда я развертываю, там только главный и он загружается.

3 голосов
/ 17 июня 2011

Если в вашем основном applicationContext.xml вы указываете несколько поисков свойств, как указано ниже, с помощью PropertiesFactoryBean, все пропущенные файлы свойств не загружаются и используется последний успешно загруженный файл свойств.В вашем случае будут загружены default.properties (например, ваш файл свойств теста), и поскольку второй файл: $ {catalina} ... не будет загружен, в поля @Value будут вставлены значения, указанные по умолчанию.свойства.

Ответ взят из здесь :

<bean id="myProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
   <property name="ignoreResourceNotFound" value="true" />
   <property name="locations">
      <list>
        <value>classpath:default.properties</value>
        <value>file:${catalina.home}/webapps/myProperties.properties</value>
      </list>
   </property>
</bean> 
3 голосов
/ 17 июня 2011

Работает ли это, если вы добавляете тот же атрибут location к context:property-placeholder, определенному в testContext.xml, который указан в applicationContex.xml?Вам также необходимо добавить атрибут local-override="true", чтобы properties-ref переопределял атрибуты из-под META-INF.

Редактировать:

Учитывая ваш последний комментарий, я думаю, что вы будетенужно отказаться от использования пространства имен context и напрямую использовать объекты Spring, которые используются за кулисами.Возможно, что-то вроде этого:

В applicationContext.xml:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath*:META-INF/spring/*.properties" />
</bean>

В testContext.xml:

<bean id="propertyConfigurerTest" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" parent="propertyConfigurer">
    <property name="properties" ref="simulatedTomcatProperties" />
    <property name="localOverride" value="true" />
</bean>
<util:properties id="simulatedTomcatProperties">
   <prop key="cfmt.applicationBaseUrl">localhost:8080/cfmt</prop>
</util:properties>

Я предполагаю, что вы хотите, чтобы локальные свойства переопределялисвойства определены из ресурсов classpath, поэтому я определил localOverride как true.

1 голос
/ 12 декабря 2012

Я решил проблему, разделив applicationContext.xml на два файла: - applicationContext.xml - содержит "обычный" компонент, но НЕ включает applicationContext-properties.xml - applicationContext-properties.xml - содержит свойство-заполнитель config

applicationContext-properties.xml:

 <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
      <property name="locations" value="classpath*:META-INF/spring/*.properties" />
      <property name="ignoreUnresolvablePlaceholders" value="false" />
 </bean>

Веб-приложение загружает оба файла при запуске:

web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>

Для моих тестов Iдобавили файл свойств: simulatedTomcat.test-properties, который содержит все свойства tomcat. примечание: этот файл не соответствует шаблону, используемому в конфигураторе заполнителя свойств applicationContext-properties.xml

Тогда у меня есть конфигуратор заполнителя свойств для моего теста, который загружает оба типа свойств файлов операций (*.properties и *.test-properties)

test-context.xml

<import resource="classpath:/META-INF/spring/applicationContext.xml" />
<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
   <property name="locations">
      <list>
         <value>classpath*:META-INF/spring/*.properties</value>
         <value>classpath*:META-INF/spring/*.test-properties</value>
      </list>
   </property>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...