2017-04-12 12 views
0

저는 응용 프로그램을 시작하기 위해 많은 VM 인수가 전달되는 스프링 부트 프로젝트, 즉 cert 위치, 특정 프로파일 유형 (dev, qa, prod 등).
default.yml 파일에서 모든 구성을 이동하려고합니다. default.yml 설정
문제 설명
속성은 스프링 컨텍스트에만 즉 org.springframework.core.env.Environment의 환경 인터페이스에 액세스하고 속성은 기본적에 의해 자동/시스템 속성으로 설정되어 있지 않습니다 .
시스템의 속성을 ServletContextListenercontextInitialized의 메서드로 설정하고 있습니다.
하지만 명시 적으로 모든 속성을 이름으로 환경을 사용하여 불러오고 싶지 않습니다 .getProperty (key), 오히려 봄의 컨텍스트에서 사용할 수있는 모든 속성을 루프해야/루프를 시스템/환경 변수에 설정하지 않았 으면합니다.
예상 솔루션
listner 메소드 내부에서 default.yml 파일에 정의 된 모든 속성을 이름으로 속성에 액세스하지 않고 시스템 속성으로 설정할 수있는 방법을 찾고 있습니다..yml 파일 안의 모든 스프링 부팅 속성을 시스템 속성으로 설정하십시오.

다음은 현재 env/default.yml에서 추출한 활성 프로파일을 시스템 특성으로 설정하는 방법입니다. 나는 활성 프로파일을 얻거나 yml에서 어떤 속성을 얻고 싶지 않지만, .yml 안에있는 모든 속성을 시스템에 자동으로 설정하고 싶습니다.

Optional.ofNullable(springEnv.getActiveProfiles()) 
      .ifPresent(activeProfiles -> Stream.of(activeProfiles).findFirst().ifPresent(activeProfile -> { 
       String currentProfile = System.getProperty("spring.profiles.active"); 
       currentProfile = StringUtils.isBlank(currentProfile) ? activeProfile : currentProfile; 
       System.setProperty("spring.profiles.active", currentProfile); 
      })); 

답변

0

이 같은 것을 사용할 수 있습니다 :

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.core.env.MapPropertySource; 
import org.springframework.core.env.PropertySource; 
import org.springframework.core.env.StandardEnvironment; 
import org.springframework.stereotype.Component; 

import javax.annotation.PostConstruct; 
import java.util.Properties; 

@Component 
public class EnvTest { 

    final StandardEnvironment env; 

    @Autowired 
    public EnvTest(StandardEnvironment env) { 
     this.env = env; 
    } 

    @PostConstruct 
    public void setupProperties() { 
     for (PropertySource<?> propertySource : env.getPropertySources()) { 
      if (propertySource instanceof MapPropertySource) { 
       final String propertySourceName = propertySource.getName(); 
       if (propertySourceName.startsWith("applicationConfig")) { 
        System.out.println("setting sysprops from " + propertySourceName); 
        final Properties sysProperties = System.getProperties(); 

        MapPropertySource mapPropertySource = (MapPropertySource) propertySource; 
        for (String key : mapPropertySource.getPropertyNames()) { 
         Object value = mapPropertySource.getProperty(key); 
         System.out.println(key + " -> " + value); 
         sysProperties.put(key, value); 
        } 
       } 
      } 
     } 
    } 
} 

물론

는, 표준 출력 메시지를 제거하십시오 그것은 당신의 답변을 들어,

+0

안녕 Meisch에 대한 감사 작업 때. 나는 비슷한 일을 끝냈다 :) –