이 파일에 필요한 모든 속성을 열거하지 않고 속성의 일부 파일을받는 방법 :봄 - 다음과 같은
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
우수함,이 그것을 고정! 나는 이미 환경 ('ConfigurableEnvironment')을 가지고 있었기 때문에'environment.getProperty (k)'라고 불렀다.아니면'ConfigurableEnvironment'가 아닌'Environment'를 별도로 주입해야 할 충분한 이유가 있을까요? – Jessy56
ConfigurableEnvironment는 환경을 확장합니다. 따라서 주사를 한 번하는 것이 좋습니다. 그 점에 감사드립니다. 그에 따라 대답을 업데이트 할 것입니다. –
좋아요! 고마워. – Jessy56