복붙노트

[SPRING] 스프링으로 프로퍼티로드 (시스템 프로퍼티를 통해)

SPRING

스프링으로 프로퍼티로드 (시스템 프로퍼티를 통해)

내 문제는 다음과 같습니다 :

다른 환경에 server.properties가 있습니다. 이러한 속성에 대한 경로는 propertyPath라는 시스템 속성을 통해 제공됩니다. applicationContext.xml에 System.getProperty ( '')를 호출하는 추악한 MethodInvokingBean없이 주어진 propertyPath 시스템 속성으로 속성을로드하도록 지시하려면 어떻게해야합니까?

내 applicationContext.xml

<bean id="systemPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
        <property name="placeholderPrefix" value="sys{"/>
        <property name="properties">
            <props>
                <prop key="propertyPath">/default/path/to/server.properties</prop>
            </props>
        </property>
    </bean>


    <bean id="propertyResource" class="org.springframework.core.io.FileSystemResource" dependency-check="all" depends-on="systemPropertyConfigurer">
        <constructor-arg value="sys{propertyPath}"/>
    </bean>

    <bean id="serviceProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="location" ref="propertyResource"/>
    </bean>

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" ref="propertyResource"/>
        <property name="placeholderPrefix" value="prop{"/>

        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="ignoreResourceNotFound" value="false"/>
    </bean>

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
         <property name="jndiName" value="prop{datasource.name}"/>
    </bean>

이 구성을 통해 propertysource는 항상

java.io.FileNotFoundException: sys{propertyPath} (The system cannot find the file specified)

어떤 제안? ;-) 고마워요.

편집하다:

이제 bean의 로딩 프로세스를 디버깅했으며 systemPropertyConfigurer가 생성되기 전에 propertyConfigurer의 setLocation 메서드가 호출되어 "property {resource}"가 "sys {propertyPath}"로 초기화됩니다. 나는 의존하지만 운이없는 주위에서 놀았습니다.

해결법

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

    1.승인. 나는 그것을 해결했다. 문제는 내 PropertyPlaceholders 둘 다 BeanFactoryPostProcessor이고 컨텍스트가로드 된 후에 처리되지만 속성은 설정됩니다. 따라서 한 PropertyPlaceholder를 다른 PropertyPlaceholder로 채우는 것은 불가능합니다.

    승인. 나는 그것을 해결했다. 문제는 내 PropertyPlaceholders 둘 다 BeanFactoryPostProcessor이고 컨텍스트가로드 된 후에 처리되지만 속성은 설정됩니다. 따라서 한 PropertyPlaceholder를 다른 PropertyPlaceholder로 채우는 것은 불가능합니다.

    package property.util;
    
    import org.apache.commons.lang.StringUtils;
    import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
    import org.springframework.core.io.FileSystemResource;
    import org.springframework.core.io.Resource;
    
    import java.io.IOException;
    import java.util.Properties;
    
    /**
     * ConfigurablePropertyPlaceholder takes instructions which SystemProperty
     * contains the path to the propertyfile to load.
     *
     * @author Gabe Kaelin
     * 
     */
    public class ConfigurablePropertyPlaceholder extends PropertyPlaceholderConfigurer {
    
    
        private String propertyLocationSystemProperty;
        private String defaultPropertyFileName;
    
    
        public String getPropertyLocationSystemProperty() {
            return propertyLocationSystemProperty;
        }
    
        public void setPropertyLocationSystemProperty(String propertyLocationSystemProperty) {
            this.propertyLocationSystemProperty = propertyLocationSystemProperty;
        }
    
        public String getDefaultPropertyFileName() {
            return defaultPropertyFileName;
        }
    
        public void setDefaultPropertyFileName(String defaultPropertyFileName) {
            this.defaultPropertyFileName = defaultPropertyFileName;
        }
    
        /**
         * Overridden to fill the location with the path from the {@link #propertyLocationSystemProperty}
         *
         * @param props propeties instance to fill
         * @throws IOException
         */
    
        @Override
        protected void loadProperties(Properties props) throws IOException {
            Resource location = null;
            if(StringUtils.isNotEmpty(propertyLocationSystemProperty)){
    
                String propertyFilePath = System.getProperties().getProperty(propertyLocationSystemProperty);
                StringBuilder pathBuilder = new StringBuilder(propertyFilePath);
    
                if(StringUtils.isNotEmpty(defaultPropertyFileName) && !propertyFilePath.endsWith(defaultPropertyFileName)){
                    pathBuilder.append("/").append(defaultPropertyFileName);
                }
    
                location = new FileSystemResource(pathBuilder.toString());
            }
    
            setLocation(location);
            super.loadProperties(props);
        }
    }
    

    해당 applicationContext.xml 항목

    <bean id="propertyConfigurer" class="property.util.ConfigurablePropertyPlaceholder">
      <property name="propertyLocationSystemProperty" value="propertyPath" />
      <property name="defaultPropertyFileName" value="server.properties" />
      <property name="ignoreResourceNotFound" value="false"/>
    </bean>
    

    자바 프로세스는 다음과 같이 시작될 수있다.

    java -DpropertyPath=/path/to/properties
    

    속성을로드하면 applicationContext.xml에서 사용할 수 있습니다.

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

    2.PropertyPlaceholderConfigurer를 확장하기위한 솔루션은 괜찮은 것처럼 보이지만 추가 코드를 작성하지 않고 표준 org.springframework.beans.factory.config.PropertiesFactoryBean 구현에 의존해야합니다.

    PropertyPlaceholderConfigurer를 확장하기위한 솔루션은 괜찮은 것처럼 보이지만 추가 코드를 작성하지 않고 표준 org.springframework.beans.factory.config.PropertiesFactoryBean 구현에 의존해야합니다.

    Spring이 해결할 변수 참조를 사용하기 만하면됩니다.

    e.

    다음과 같이 spring을 구성하십시오.

    <bean id="configProp"
          class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>file:${propertyPath}</value>
            </list>
        </property>
    </bean>
    

    env 변수 (propertyPath)를 사용하여 Java를 호출하면 Spring은이를 해결하고 속성 파일을로드하여 응용 프로그램 컨텍스트에 삽입합니다

    java -DpropertyPath = / path / to / properties

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

    3.두 가지 옵션이 있습니다.

    두 가지 옵션이 있습니다.

  4. from https://stackoverflow.com/questions/2789511/loading-properties-with-spring-via-system-properties by cc-by-sa and MIT license