복붙노트

[SPRING] 다중 컨텍스트에서 속성을 찾을 수 없습니다 : property-placeholder

SPRING

다중 컨텍스트에서 속성을 찾을 수 없습니다 : property-placeholder

콩을 적재하기 위해 스프링 프로파일을 가진 스프링 3.1을 사용하고 있습니다. 내 애플 리케이션 컨텍스트 파일에서 같은 속성을로드 할 :

<context:property-placeholder order="1"  location="classpath*:META-INF/spring/*_${spring.profiles.active}.properties" ignore-unresolvable="true"/>

그런 다음 속성 값을 사용하여 데이터 소스 bean을로드합니다.

<property name="driverClassName" value="${database.driverClassName}"/>

그것은 잘 작동합니다. 문제는 일부 데이터베이스 테이블의 속성을로드 할 수 있도록 더 많은 속성 자리 표시자를 추가 할 때 시작됩니다.

이것은 다음에 의해로드 된 속성 참조를 사용합니다.

<bean id="configFactoryBean"
class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean">
   <constructor-arg ref="globalSystemConfiguration"/>
</bean>

세부 사항을 추가하기 위해이 configFactoryBean은 데이터 소스를 사용하여 데이터베이스에서 속성을로드합니다.

이 작업을 수행 할 때 다음 예외가 있습니다.

java.lang.ClassNotFoundException: ${database.driverClassName}

내 분석은 첫 번째 컨텍스트 속성 자리 표시 자에서 속성을 확인하기 전에 데이터 소스를로드하려고합니다. 나는 틀릴지도 모른다. 또는 스프링 프로파일 변수가 제대로 해석되지 않습니다.

누구든지이 문제를 해결하도록 도와주세요.

감사 아키

해결법

  1. ==============================

    1.여러 속성 자리 표시 자에 대한이 버그는 문제와 관련이 있습니다. https://jira.spring.io/browse/SPR-9989

    여러 속성 자리 표시 자에 대한이 버그는 문제와 관련이 있습니다. https://jira.spring.io/browse/SPR-9989

  2. ==============================

    2.각 는 PropertyPlaceholderConfigurer의 새 인스턴스를 만듭니다. 응용 프로그램마다 하나의 응용 프로그램 수준이 있어야하며 라이브러리 수준이 아니라 응용 프로그램 수준에서 하나씩 사용해야합니다. 이렇게하면 유지 관리가 훨씬 쉬워집니다.

    는 PropertyPlaceholderConfigurer의 새 인스턴스를 만듭니다. 응용 프로그램마다 하나의 응용 프로그램 수준이 있어야하며 라이브러리 수준이 아니라 응용 프로그램 수준에서 하나씩 사용해야합니다. 이렇게하면 유지 관리가 훨씬 쉬워집니다.

    자세한 내용과 제안을 보려면 여기를 클릭하십시오. http://rostislav-matl.blogspot.cz/2013/06/resolving-properties-with-spring.html

  3. ==============================

    3.내 응용 프로그램에서는 다음과 같은 방법으로 속성 자리 표시 자 구성자를 사용하고 있으며 아주 잘 작동합니다. 너는 그것을 시도 할 수있다.

    내 응용 프로그램에서는 다음과 같은 방법으로 속성 자리 표시 자 구성자를 사용하고 있으며 아주 잘 작동합니다. 너는 그것을 시도 할 수있다.

    <bean id="propertyConfigurer"
              class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
              <property name="locations">
                <list>
                    <value>classpath*:META-INF/spring/*_${spring.profiles.active}.properties</value>
                </list>
              </property>
        </bean>
    

    나는 이것이 당신의 문제를 해결해야한다고 생각합니다. :)

  4. ==============================

    4.구성 파일의 경로를 하드 코딩하도록 제안 했으므로 태그의 profiles 속성을 사용하여 선택적으로 구성을 포함 시키십시오.

    구성 파일의 경로를 하드 코딩하도록 제안 했으므로 태그의 profiles 속성을 사용하여 선택적으로 구성을 포함 시키십시오.

    <beans profile="profileName">
        <context:property-placeholder  order="1"  location="classpath*:META-INF/spring/hardcoded.properties" ignore-unresolvable="true"/>
    </beans>
    
    <beans profile="profileName2">    
        <context:property-placeholder order="1"  location="classpath*:META-INF/spring/hardcoded.properties" ignore-unresolvable="true"/>
    </beans>
    

    프로파일을 설명하는이 기사를 참조하십시오 : http://java.dzone.com/articles/using-spring-profiles-xml

  5. from https://stackoverflow.com/questions/16892752/property-not-found-with-multiple-contextproperty-placeholder by cc-by-sa and MIT license