[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.승인. 나는 그것을 해결했다. 문제는 내 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.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.두 가지 옵션이 있습니다.
두 가지 옵션이 있습니다.
from https://stackoverflow.com/questions/2789511/loading-properties-with-spring-via-system-properties by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] current_session_context_class 등록 정보 사용 최대 절전 모드 3 최대 절전 모드 4 (0) | 2019.03.21 |
---|---|
[SPRING] 스프링 MVC가 리다이렉트를하지 못하게하려면 어떻게해야합니까? (0) | 2019.03.21 |
[SPRING] 런타임시 스프링 / 스프링 부트 속성 설정 / 무시 (0) | 2019.03.21 |
[SPRING] Eclipse : javadoc 추가 (0) | 2019.03.21 |
[SPRING] 스프링 부트 2 및 OAuth2 / JWT 구성 (0) | 2019.03.21 |