0

this answer에 따르면 Spring 일괄 처리 클래스 org.springframework.batch.support.SystemPropertyInitializer을 사용하여 스프링 컨텍스트를 시작할 때 시스템 속성을 설정할 수 있습니다.속성 자리 표시자를 설정하기 전에 SystemPropertyInitializer를 사용하여 속성 자리 표시자를 설정하기 전에

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:/org/springframework/batch/admin/bootstrap/batch.properties</value> 
      <value>classpath:batch-default.properties</value> 
      <value>classpath:batch-${ENVIRONMENT:hsql}.properties</value> 
     </list> 
    </property> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="ignoreUnresolvablePlaceholders" value="false" /> 
    <property name="order" value="1" /> 
</bean> 

그러나 SystemPropertyInitializer을 시스템 속성을 설정하려면 afterPropertiesSet()를 사용하고, 분명히이 후 을 발생합니다 특히

, 나는 스프링 배치 설정의 일부를 읽기 때문에 ENVIRONMENT을 설정하는 데 사용할 수 있기를 기대했다 구성은 PropertyPlaceholderConfigurer입니다.

이것을 달성 할 수 있습니까?

답변

2

가장 쉬운 해결책은 환경 속성을 명령 줄 인수로 전달하는 것이므로 시스템 속성으로 확인할 수 있습니다.

이 옵션이 없으면 환경 속성을 시스템 속성으로 올리는 ApplicationContextInitializer을 구현할 수 있습니다.

다음
public class EnvironmentPropertyInitializer implements 
        ApplicationContextInitializer<ConfigurableApplicationContext> { 

    boolean override = false; //change if you prefer envionment over command line args 

    @Override 
    public void initialize(final ConfigurableApplicationContext applicationContext) { 
     for (Entry<String, String> environmentProp : System.getenv().entrySet()) { 
      String key = environmentProp.getKey(); 
      if (override || System.getProperty(key) == null) { 
       System.setProperty(key, environmentProp.getValue()); 
      } 
     } 
    } 
} 

당신은 스프링 배치 관리자를 사용하는 것처럼 당신이 web.xml 파일에 약간의 추가와 함께 당신의 초기화를 등록 할 수 있도록이 보인다 :

<context-param> 
    <param-name>contextInitializerClasses</param-name> 
    <param-value>org.your.package.EnvironmentPropertyInitializer</param-value> 
</context-param> 

추가 배경 코멘트가 충분하지 않은 것으로 보인 이후 : 다음은 관련 클래스와 클래스가 호출/평가되는 순서입니다. ApplicationContextInitializer

  1. 는 애플리케이션 컨텍스트를로드와 콩 프로파일을 설정하는 데 사용할 수 있습니다, 컨텍스트의 다른 측면을 변경하는 방법 봄 응용 알려줍니다. 전에 전에 실행되면 컨텍스트가 완전히 생성됩니다.
  2. PropertyPlaceholderConfigurerBeanFactoryPostProcessor이며 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)입니다. 이렇게하면 BeanFactory으로 작성된 bean의 특성을 설정할 때 ${my.property:some.default}과 같은 특성 분석을 허용하도록 BeanFactory을 수정합니다.
  3. SystemPropertyInitializerInitializingBean을 구현하고 afterPropertiesSet()을 호출합니다. 이 메소드는 bean이 인스턴스화되고 특성이 설정된 후에 실행됩니다.

따라서 SystemPropertyInitializer은 속성이 PropertyPlaceholderConfigurer에 설정된 후에 평가되므로 여기서는 도움이되지 않을 것이라고합니다. 그러나 ApplicationContextInitializer은 해당 환경 특성을 시스템 특성으로 승격시켜 XML로 해석 할 수 있습니다.

내가해야 할 첫 번째 선언 콩 중 하나를 언급하는 것을 잊었다 하나 더 참고 :

<context:property-placeholder/> 

가 중복 보이지만, 그것은 당신의 PropertyPlaceholderConfigurer 콩이를 사용하여 ${ENVIRONMENT:hsql}을 제대로 평가 할 수 있습니다 환경 속성에 대해

+0

시스템 속성과 환경 속성의 차이점을 어떻게 적용 할 수 있는지 잘 모르겠습니다. 'SystemPropertyInitializer' 클래스는 코드 내에서'System.setProperty()'를 호출합니다. 내가 실행하고있는 것은'placeholderProperties'가 해결 될 때까지 호출되지 않는다는 것입니다. 이 솔루션에서 동일한 문제가 발생하지 않을까요? 스프링 라이프 사이클에 대한 지식이 충분하지 않습니다. – Stewart

+1

추가 정보 (의견이 너무 깁니다.) –

관련 문제