여러 프로젝트 / 모듈에서 여러 속성 파일 (PropertyPlaceholderConfigurer를 통해) 사용


104

우리는 현재 여러 프로젝트 / 모듈로 분할 된 애플리케이션을 작성하고 있습니다. 예를 들어 다음 모듈을 살펴 보겠습니다.

  • 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 커뮤니티에서 솔루션 / 아이디어에 대해 듣고 싶습니다.

답변:


182

관련된 각 컨텍스트에서 모든 자리 표시자가 확인할 수없는 키를 무시하고 있는지 확인하면 이러한 두 가지 접근 방식이 모두 작동합니다. 예를 들면 :

<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>

11
다음은 이러한 문제를 추가로 해결하는 데 도움이되는 주제에 대한 유용한 항목입니다. tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey 2010-08-04

2
감사합니다!! ignore-unresolvable = "true"는 정확히 내가 필요로했고 트릭을했습니다!
black666

1
하나의 태그에 모든 파일을 추가하면 이벤트가 필요하지 않고 ignore-unresolvable="true"그렇지 않으면 필요합니다.
Eric Wang

의 의미를 설명해 주 ignoreUnresolvablePlaceholders시겠습니까? 확인할 수없는 자리 표시자는 무엇입니까?
emeraldhieu

PropertySourcesPlaceholderConfigurerSpring 3.1 이후 기본 지원 구현이므로 PropertyPlaceholderConfigurerBean 구현 클래스 대신 사용하는 것이 좋습니다 .
jihor

18

나는 이것이 오래된 질문이라는 것을 알고 있지만 ignore-unresolvable재산이 나를 위해 작동하지 않았고 그 이유를 알지 못했습니다.

문제는 내가 외부 자원을 (같은이 필요하다고했다 location="file:${CATALINA_HOME}/conf/db-override.properties")과는 ignore-unresolvable="true"이 경우에 일을하지 않습니다.

누락 된 외부 리소스를 무시하기 위해해야 ​​할 일은 다음과 같습니다.

ignore-resource-not-found="true"

다른 사람이 이것에 부딪 힐 경우를 대비하여.


3
ignore-unresolvableignore-resource-not-found다른 목적을 제공합니다. 특성 파일 이 없을 때 오류를 방지하려면을 사용하십시오 ignore-resource-not-found="true". 존재하지 않는 속성을 사용할 때 오류를 방지하려면 파일에 사용을 ignore-unresolvable="true". 각각 부분적인 속성 집합을 포함하는 여러 파일이 있고 각 파일이 존재하거나 존재하지 않을 수있는 경우 둘 다 사용해야합니다.
datguy

8

<context:property-placeholder />여러 PropertiesPlaceholderConfigurer Bean을 명시 적으로 선언하는 대신 여러 요소를 가질 수 있습니다 .


나는 두 개의 <context : property-placeholder /> 요소를 사용해 보았고 스프링이 지정된 속성을 식별 할 수 없다고 불평했습니다. 나는 그것이 작동하도록 받아 들여진 대답을 구현해야한다.
Mushy


2

아래 해결책을 시도해 보았지만 내 컴퓨터에서 작동합니다.

<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/


주문이 필요합니까? 나는 이것을 시도했고 jvm은 불평했다.
Mushy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.