2015-06-03 3 views
0

У меня есть два конфигурационных файла xml с использованием property-placeholder. У меня возникла проблема, когда порядок операторов импорта для этих двух файлов конфигурации будет влиять на SPEL в одном из файлов конфигурации.Spring Multiple Property Placeholder и SPEL order independent

конфиг-a.xml

<context:property-placeholder 
      location="classpath:dev/food.properties" 
      ignore-unresolvable="true" /> 

<bean id="foodNames" class="java.util.HashMap"> 
    <constructor-arg> 
     <map key-type="com.my.project.Food" 
      value-type="java.lang.String"> 
      <entry key="#{T(com.my.project.Food).SUSHI}" 
       value="${dynamodb.sushi:#{null}}" /> 
     </map> 
    </constructor-arg> 
</bean> 

конфиг-b.xml

<context:property-placeholder 
      location="classpath:dev/animals.properties" 
      ignore-unresolvable="true" /> 

Если я импортировать config-a.xml до того config-b.xml значение правильно установлен в foodNames карте. Но если я установил config-b.xml до config-a.xml, значение равно null. Более наглядный пример можно увидеть ниже.

весна-диспетчерская-servlet.xml

// Value is properly set 
<import resource="classpath:spring/config-a.xml" /> 
<import resource="classpath:spring/config-b.xml" /> 

// Value is null 
<import resource="classpath:spring/config-b.xml" /> 
<import resource="classpath:spring/config-a.xml" /> 

Что я могу сделать, чтобы сделать его заказ независимым?

+0

весна версия? вы нажмете эту ошибку: https://jira.spring.io/browse/SPR-9989 –

+0

Весна 4.1.6, и да, это ошибка, с которой я сталкиваюсь – Hank

+1

Не используйте XML-конфигурацию java и используйте '@ PropertySource', чтобы объявить ваши файлы. Таким образом, у вас есть одно свойство-placeholder и все еще возможность использовать несколько файлов свойств. –

ответ

1

Самый простой (и я подозреваю, рекомендуемый подход) заключается в использовании конфигурации на основе Java. В этой конфигурации определите компонент для PropertySourcesPlaceholderConfigurer и используйте аннотации @PropertySource для загрузки ваших файлов свойств.

@Configuration 
@PropertySource("classpath:dev/food.properties") 
public class ConfigA {} 

@Configuration 
@PropertySource("classpath:dev/animals.properties") 
public class ConfigB {} 

@Configuration 
@ComponentScan("your-packages-here") 
public class RootConfig { 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

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

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