2017-01-25 2 views
0

한다고 가정 genericDirectory 자리 컴파일 타임에 알 수없는 다음과 같은 봄 구성을 갖는 런타임에 자리 값을 추가합니다

@Configuration 
@PropertySource("${genericDirectory}/additional.properties") 
public class SomeConfiguration{ 
    //... 
} 

내가 컨텍스트를 새로 고침하기 전에 속성을 추가하려고 노력을하지만, 여전히 얻을 예외

public static BeanFactory createContext(String genericDirectoryName) { 
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); 

    PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 

    Properties props = new Properties(); 
    props.setProperty("genericDirectory", genericDirectoryName); 

    configurer.setProperties(props); 

    applicationContext.addBeanFactoryPostProcessor(configurer); 

    applicationContext.register(SomeConfiguration.class); 

    applicationContext.refresh(); // throws IllegalArgumentException: Could not resolve placeholder 'genericDirectory' 

    return applicationContext; 
} 

또한 부모 컨텍스트에서 속성을 설정하고 setParent 메서드를 통해 자식에게 전달하려고했지만 성공하지 못했습니다 (동일한 예외가 발생했습니다).

런타임에 ApplicationContext에 속성을 추가하는 방법을 보여주십시오.

추신. 이 경우에는 숨겨진 구성이 없습니다. 컨텍스트는 그대로 수동으로 생성됩니다.

+2

결코 작동하지 않습니다. '@ PropertySource' 주석의 자리 표시자는 환경 변수와 시스템 변수에 대해서만 다른 속성과 비교해서 해석됩니다. 따라서 'System.setProperty'를 설정하여 해결해야합니다. 또는'@ PropertySource'를 사용하는 대신 전달 된 속성을 기반으로 수동으로'ResourcePropertySource'를 추가하십시오. –

+0

@ M.Denium, 정말 고마워요! 'System.setProperty' 또한 허용되는 방법입니다. 원한다면 코멘트가 답이 될 수 있습니다. – diziaq

답변

1

해결 속성은 다중 패스 프로세스가 아닙니다. @PropertySource에 자리 표시자를 사용하는 경우 환경 변수 또는 시스템 변수 (프로그램에 -D으로 전달 된 변수)에 대해서만 해결됩니다.

대신 지금 가지고있는 것을 수행하는 대신 System.setProperty으로 전화하십시오.

public static BeanFactory createContext(String genericDirectoryName) { 
    System.setProperty("genericDirectory", genericDirectoryName); 

    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); 
    applicationContext.refresh(); 
    return applicationContext; 
} 

이렇게하면 속성을 확인할 수 있습니다.

또한 실제로 @PropertySource을 작동 시키려면 구성에 PropertySourcesPlaceHolderConfigurer을 등록해야합니다.