복붙노트

[SPRING] Tomcat 및 ContextLoaderListener가있는 PropertyPlaceholderConfigurer

SPRING

Tomcat 및 ContextLoaderListener가있는 PropertyPlaceholderConfigurer

Tomcat 및 ContextLoaderListener와 함께 PropertyPlaceholderConfigurer를 사용하고 있습니다.

이것은 (하드 코드 된 속성 파일의 이름으로) 작동합니다 :

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/test.properties"/>
</bean>

그러나 이것 ($ {env}로 대체 된 속성 파일의 이름으로) :

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/${env}.properties"/>
</bean>

[Thread-2] 15:50:16 ERROR ContextLoader - 컨텍스트 초기화에 실패했습니다. org.springframework.beans.factory.BeanInitializationException : 속성을로드 할 수 없습니다. 중첩 예외는 java.io.FileNotFoundException : 클래스 경로 리소스 [properties / $ {env} .properties]가 존재하지 않기 때문에 열 수 없습니다.

파일을 하드 코드 할 때 작동하므로 파일이 있다는 것을 알고 있습니다.

Tomcat을 시작하고 환경 변수를 설정할 때 -Denv = test를 사용해 보았습니다. 나는 ContextLoaderListener 대신에 내 자신의 main 메소드를 사용하여 Tomcat 외부에서 똑같은 일을한다.

나는 무엇을 잘못하고있을 것인가? Context.xml 또는 web.xml의 항목을 -Denv = test 대신 사용하여 동일한 결과를 얻을 수 있습니까?

감사

추신 : 나는 또한 시도 :

<bean id="initialcorePropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName">
        <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value>
    </property>
    <property name="searchSystemEnvironment">
        <value type="boolean">true</value>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

<bean id="corePropertyConfigurer" depends-on="initialcorePropertyConfigurer" lazy-init="true"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/${env}.properties" />
</bean>

하지만 같은 오류가 발생합니다.

해결법

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

    1.PropertyPlaceholderConfigurer 정의에서 속성 자리 표시자를 사용할 수 없습니다. 닭고기와 계란.

    PropertyPlaceholderConfigurer 정의에서 속성 자리 표시자를 사용할 수 없습니다. 닭고기와 계란.

    그러나 # {systemProperties [ 'env']}를 사용할 수 있습니다.

    또는 PropertyPlaceholderConfigurer의 하위 클래스를 만들고 setLocation ()을 재정 의하여 자리 표시자를 처리 할 수 ​​있습니다.

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

    2.CATALINA_OPTS 또는 JAVA_OPTS 환경 변수를 -Denv = test로 설정해야합니다. 이를 수행하는 가장 좋은 방법은 setenv.bat (또는 유닉스에있는 경우 .sh)를 만들고이 환경 변수 정의를 거기에 추가하는 것입니다.

    CATALINA_OPTS 또는 JAVA_OPTS 환경 변수를 -Denv = test로 설정해야합니다. 이를 수행하는 가장 좋은 방법은 setenv.bat (또는 유닉스에있는 경우 .sh)를 만들고이 환경 변수 정의를 거기에 추가하는 것입니다.

    startup.bat (.sh)의 인수로 전달하면 효과가 없습니다. 여러분이하고있는 일을 가정합니다.

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

    3.전체 위치를 설정하는 대신 -DpropFileLocation = classpath : env1.properties 또는 -DpropFileLocation = classpath : env2.properties와 같이 설정하십시오.

    전체 위치를 설정하는 대신 -DpropFileLocation = classpath : env1.properties 또는 -DpropFileLocation = classpath : env2.properties와 같이 설정하십시오.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="location" value="${propFileLocation}"/>
    </bean>
    
  4. ==============================

    4.이 포럼에 속성 파일을 외부화해야하는 비슷한 질문이있었습니다. 이 솔루션을 확인하십시오. 그것은 문제가 비슷하다고 생각합니다. env를 시스템 변수로 전달하는 대신 env 변수로 설정하십시오.

    이 포럼에 속성 파일을 외부화해야하는 비슷한 질문이있었습니다. 이 솔루션을 확인하십시오. 그것은 문제가 비슷하다고 생각합니다. env를 시스템 변수로 전달하는 대신 env 변수로 설정하십시오.

  5. from https://stackoverflow.com/questions/7476615/propertyplaceholderconfigurer-with-tomcat-contextloaderlistener by cc-by-sa and MIT license