복붙노트

[SPRING] applicationContext.xml에서 환경 변수 읽기

SPRING

applicationContext.xml에서 환경 변수 읽기

web.xml에 정의 된 환경 변수를 읽어야합니다.

<env-entry>
    <description>Path Repositorio NFS</description>
    <env-entry-name>PATH_ENV</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>C:/V3</env-entry-value>
</env-entry>

내 applicationContext.xml에서

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="${PATH_ENV}/myprop.properties" />
</bean>

어떻게해야합니까?

마침내 저는 다음을했습니다 :

1 context.xml에 환경 변수를 정의하십시오.

<Environment name="PATH_ENV" type="java.lang.String"/>

2 web.xml에 env-entry 정의

<env-entry>
    <description>Path Repositorio NFS</description>
    <env-entry-name>PATH_ENV</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>/WEB-INF/</env-entry-value>
  </env-entry>

3 applicationContext.xml에 정의하십시오.

<bean id="configurationPath" class="org.springframework.jndi.JndiObjectFactoryBean">  
    <property name="jndiName">  
        <value>java:comp/env/PATH_ENV</value>  
    </property>  
</bean>  

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <property name="location">
            <bean factory-bean="configurationPath" factory-method="concat">
                <constructor-arg value="myprop.properties"/>
            </bean>
        </property>
    </bean>

이것은 올바르게 실행되지만, 전체 경로를 정의한 경우 :

<env-entry-value>C:/V3/</env-entry-value>

나는 다음 문제가있다 :

java.io.FileNotFoundException: Could not open ServletContext resource [/C:/V3/aesantasa.properties]

env-entry-value에서 전체 경로를 정의 할 수없는 이유는 무엇입니까?

해결법

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

    1.JndiObjectFactoryBean 또는 을 사용하여 JNDI 항목 (환경 항목과 자원 모두)을 조회 할 수 있습니다.

    JndiObjectFactoryBean 또는 을 사용하여 JNDI 항목 (환경 항목과 자원 모두)을 조회 할 수 있습니다.

    <jee:jndi-lookup id="PATH_ENV" jndi-name="PATH_ENV"/>
    

    (Jee 네임 스페이스를 사용하려면 반드시 선언해야합니다.)

    이는 환경 입력으로 구성된 경로를 (문자열로) 포함하는 "PATH_ENV"라는 이름의 스프링 빈을 정의합니다. 이제 다른 빈에 주입 할 수 있습니다.

    <bean class="xy.Foo">
        <property name="path" ref="PATH_ENV"/>
    </bean>
    

    나머지 어려움은 문자열을 연결하는 것입니다. (불행하게도, JNDI 환경 엔트리를 가진 자리 표시자를 대체 할 JndiPlaceholderConfigurer가 없기 때문에 $ {property} / foo 구문을 사용하여 연결할 수 없으며 또 다른 bean 정의를 제공해야합니다.

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <bean factory-bean="PATH_ENV" factory-method="concat">
                <constructor-arg>/myprop.properties</constructor-arg>
            </bean>
        </property>
    </bean>
    

    (코드 테스트를 위해 Spring 프로젝트를 가지고 있지 않기 때문에 테스트되지 않은 코드)

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

    2.context-param을 사용할 수 있습니다.

    context-param을 사용할 수 있습니다.

    <context-param>
        <param-name>PATH_ENV</param-name>
        <param-value>C:/V3</param-value>
    </context-param>
    
  3. ==============================

    3.왜 다음을 사용하지 않는 것이 좋을까요?

    왜 다음을 사용하지 않는 것이 좋을까요?

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="location" value="file:C:/V3/myprop.properties"/>
    </bean>
    
  4. ==============================

    4.나는 비슷한 것을 해결했다고 생각한다.

    나는 비슷한 것을 해결했다고 생각한다.

    경로의 변화하는 부분으로 Windows 시스템 변수를 만듭니다.

    my computer --> advanced options --> environment options --> Systeme Variable
    

    그리고 나서 이것으로 스프링 AppContext에서 다음과 같은 경로를 완성합니다 :

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    
       <property name="locations">  
           <list>
                  <value>file:${PARENT_PATH}/conf/dev/jdbc.properties</value>
           <list>           
       </property>
    </bean>
    

    나는 정말로 도움이되는지 모르지만, 나를 위해 일한다.

  5. from https://stackoverflow.com/questions/12391474/read-an-environment-variable-from-applicationcontext-xml by cc-by-sa and MIT license