2017-10-25 15 views
0
내가 내 속성을로드하고

이 파일에 필요한 모든 속성을 열거하지 않고 속성의 일부 파일을받는 방법 :봄 - 다음과 같은

database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb 
database.dataSource.x=... 
database.dataSource.y=... 
database.dataSource.z=... 
: 속성에서

@Configuration 
@PropertySource("classpath:app.properties") 
class MyApp { 
    @Bean 
    public PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

는 파일, 나는 여러 데이터베이스 관련 특성을 가지고

참고 :

  • ${db-port} 중 하나를 교체해야합니다 속성/환경 변수의 값은 db-port 또는 5432입니다. 제 경우 Tomcat 컨테이너를 생성 할 때 환경 변수 db-port을 정의합니다.

  • 모든 데이터베이스 관련 속성은 database. 루트 아래에 그룹화되어 있습니다. 이는 의도적 인 것으로, 아래를 참조하십시오.

은 내가/열거 내 코드에서 가능한 모든 데이터베이스 관련 특성을 하드 코딩한다는 것을 피하려고. 다행히도 사용중인 데이터베이스 계층 (Hikari)은 java.util.Properties을 통해 모든 특성을 전달할 수 있다는 좋은 특징이 있습니다. 그래서 나는 정의 된 모든 속성을 database.* 아래로 가져와 히카리로 전달하기를 원합니다.

get("database.") 호출 할 때 속성에 정의 된 지금, 나는 모든 데이터베이스 관련 특성을 가지고
@Component 
public class PropertyFetcher 
{ 
    @Autowired 
    private ConfigurableEnvironment environment; 

    public Properties get(final String key) { 
     final Properties p = new Properties(); 

     for (final PropertySource<?> s : environment.getPropertySources()) { 
      if (s instanceof EnumerablePropertySource) { 
       for (final String k : ((EnumerablePropertySource) s).getPropertyNames()) { 
        if (k.startsWith(key) && k.length() > key.length()) { 
         p.put(k.substring(key.length()), s.getProperty(k)); 
        } 
       } 
      } 
     } 
     return p; 
    } 
} 

파일이 들어

, 나는 다음과 같은 유틸리티를 썼다. 큰! 그러나, 재산 dataSource.url의 값은 그래서 어떤 이유로 ${db-port:5432}는 (아직?) 해결되지 않은이 길 ( ConfigurableEnvironment)를 통해 갈 때 지금

jdbc:postgresql://localhost:${db-port:5432}/mydb 

대신

jdbc:postgresql://localhost:9876/mydb 

입니다.

어떻게이 문제를 해결할 수 있습니까? 아니면 코드에 열거/하드 코딩하지 않고 특정 루트 아래에서 모든 속성을 가져 오는 더 좋은 방법이 있습니까?

기본 시나리오에서 database.dataSource.url=jdbc:postgresql://localhost:${db-port:5432}/mydb 속성의 ${db-port:5432}이 올바르게 해결된다는 점에 유의하십시오. 나는 다음과 같은 멤버를 정의하고 로깅하여 테스트했다.

@Value("${database.dataSource.url}") 
final String url; // holds jdbc:postgresql://localhost:9876/mydb 

답변

1

실제 환경에서만 속성 값을 읽어야한다. 그런 다음 부동산의 실제 또는 실제 가치를 얻습니다.

코드에 약간의 변경이 필요합니다.

변경이 줄이에

p.put(k.substring(key.length()), s.getProperty(k)); 

:

p.put(k.substring(key.length()), environment.getProperty(k)); 
+0

우수함,이 그것을 고정! 나는 이미 환경 ('ConfigurableEnvironment')을 가지고 있었기 때문에'environment.getProperty (k)'라고 불렀다.아니면'ConfigurableEnvironment'가 아닌'Environment'를 별도로 주입해야 할 충분한 이유가 있을까요? – Jessy56

+0

ConfigurableEnvironment는 환경을 확장합니다. 따라서 주사를 한 번하는 것이 좋습니다. 그 점에 감사드립니다. 그에 따라 대답을 업데이트 할 것입니다. –

+0

좋아요! 고마워. – Jessy56