우리는 현재 여러 프로젝트 / 모듈로 분할 된 애플리케이션을 작성하고 있습니다. 예를 들어 다음 모듈을 살펴 보겠습니다.
- myApp-DAO
- myApp-jabber
각 모듈에는 고유 한 Spring 컨텍스트 xml 파일이 있습니다. DAO 모듈의 경우 필요한 db 연결 매개 변수가있는 속성 파일을 읽는 PropertyPlaceholderConfigurer가 있습니다. jabber 모듈에는 jabber 연결 속성에 대한 PropertyPlaceHolderConfigurer도 있습니다.
이제 myApp-DAO 및 myApp-jabber를 포함하는 기본 애플리케이션이 제공됩니다. 모든 컨텍스트 파일을 읽고 하나의 큰 Spring 컨텍스트를 시작합니다. 불행히도 컨텍스트 당 PropertyPlaceholderConfigurer는 하나만있을 수 있으므로 먼저로드되는 모듈이 연결 매개 변수를 읽을 수 있습니다. 다른 하나는 “자리 표시 자 ‘jabber.host’를 확인할 수 없습니다. ‘와 같은 오류와 함께 예외를 발생시킵니다.
나는 문제가 무엇인지 이해하지만 실제로 해결책이나 내 사용 사례에 대한 모범 사례를 알지 못합니다.
각 모듈이 자체 속성 파일을로드 할 수 있도록 각 모듈을 어떻게 구성합니까? 지금은 별도의 컨텍스트 파일에서 PropertyPlaceHolderConfigurer를 이동하여 기본 응용 프로그램의 컨텍스트에 병합했습니다 (단일 PropertyPlaceHolderConfigurer로 모든 속성 파일로드). 하지만 이제는 dao 모듈을 사용하는 모든 사람이 자신의 컨텍스트에서 PropertyPlaceHolderConfigurer가 필요하다는 것을 알아야하므로 dao 모듈의 통합 테스트가 실패합니다.
stackoverflow 커뮤니티에서 솔루션 / 아이디어에 대해 듣고 싶습니다.
답변
관련된 각 컨텍스트에서 모든 자리 표시자가 확인할 수없는 키를 무시하고 있는지 확인하면 이러한 두 가지 접근 방식이 모두 작동합니다. 예를 들면 :
<context:property-placeholder
location="classpath:dao.properties,
classpath:services.properties,
classpath:user.properties"
ignore-unresolvable="true"/>
또는
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:dao.properties</value>
<value>classpath:services.properties</value>
<value>classpath:user.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
답변
나는 이것이 오래된 질문이라는 것을 알고 있지만 ignore-unresolvable
재산이 나를 위해 작동하지 않았고 그 이유를 알지 못했습니다.
문제는 내가 외부 자원을 (같은이 필요하다고했다 location="file:${CATALINA_HOME}/conf/db-override.properties"
)과는 ignore-unresolvable="true"
이 경우에 일을하지 않습니다.
누락 된 외부 리소스를 무시하기 위해해야 할 일은 다음과 같습니다.
ignore-resource-not-found="true"
다른 사람이 이것에 부딪 힐 경우를 대비하여.
답변
<context:property-placeholder />
여러 PropertiesPlaceholderConfigurer Bean을 명시 적으로 선언하는 대신 여러 요소를 가질 수 있습니다 .
답변
PropertiesPlaceholderConfigurer
빈은 “propertiesArray”라는 또 다른 속성이 있습니다. “properties”속성 대신이 속성을 사용하고 <array>
속성 참조를 사용하여 구성합니다 .
답변
아래 해결책을 시도해 보았지만 내 컴퓨터에서 작동합니다.
<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />
<context:property-placeholder location="classpath*:general.properties" order="2"/>
Spring 컨텍스트에 여러 요소가있는 경우 따라야 할 몇 가지 모범 사례가 있습니다.
order 속성은 Spring에 의해 처리되는 순서를 수정하기 위해 지정되어야합니다. 모든 속성 자리 표시 자에서 마지막 하나 (가장 높은 순서)를 제외한 모든 속성 자리 표시
ignore-unresolvable=”true”
자는 해결 메커니즘이 예외를 throw하지 않고 컨텍스트에서 다른 사람에게 전달할 수 있도록 해야합니다.
출처 : http://www.baeldung.com/2012/02/06/properties-with-spring/