2017-11-15 17 views
3

Java 및 스프링 부팅 응용 프로그램으로 작업하고 있습니다. 런타임에 도커 이미지의 환경 변수로 추가해야하는 속성 파일이 있습니다. 다음과 같이 자리 표시자를 통해 사용되면 일부 속성은 기존 환경을 통해 필터링됩니다.간단한 자바 프로그램에서 스프링 속성 자리 표시자를 바꾸는 방법

app.name=MyApp 
app.description=${app.name} is a Spring Boot application 

이 속성 파일을 읽고 일부 필터링 된 속성을 사용하여 샘플 Java 파일을 작성했습니다. 이 과정에서 어떻게 자리 표시자를 실제 속성 값으로 바꿀 수 있습니까?

나는 키를 찾고 getProperty 메서드를 사용하여 바꾸려고 시도했습니다. 하지만 난 유지 어려움을 피하기 위해 하드 코딩 된 속성 키 이름을 찾는 것을 피하고 싶습니다. 미리 감사드립니다.

답변

2

나는 속성 값을 얻는 방법, 새로운 Properties 자손을 만들 것 , 존재하는 경우 참조를 대체합니다. 이 같은

뭔가 :

class MyProperties extends Properties 
{ 
    // Constructors, as needed 
    private Pettern p = Pattern.compile("\\$\\{([^}]+)\\}"); 
    public String getString(final String key) 
    { 
     final String value = getProperty(key); 
     if (null == value) 
      return null; 
     final StringBuffer result = new StringBuffer(); 
     final Matcher m = p.matcher(value); 
     while (m.find()) 
     { 
      final String refKey = m.group(1); 
      final String refValue = getProperty(refKey); 
      m.appendReplacement(result, null == refValue ? refKey : refValue); 
     } 
     m.appendTail(result); 
     return result.toString(); 
    } 
} 
+0

완벽하게 작동합니다 ... 매우 감사합니다. 두 번째 줄에 오타가 있음을 지적하고 싶습니다. 개인 패턴 p = Pattern.compile ("\\ $ \\ { ([^}] +) \\} "); – Sathya

2

숫자가 지정된 토큰을 번호가 매겨진 토큰으로 바꾸고 MessageFormat Java SE 클래스를 사용하십시오. 그것은 당신이 요구하는 것을 정확하게 할 수있게 해줍니다.

소품이 파일에서로드 된 모든 속성을 포함한다고 가정합니다. 여기

MessageFormat.format((String) props.get("app.description"),((String) props.get("app.name")); 

당신의 속성은 다음과 같다 그밖에

app.description={0} is a Spring Boot application

사용자 정의를 작성해야합니다

+0

이 코드 세그먼트는 자리 표시 자 값을 대체하지 않습니다. $ {1} – Sathya

+0

@Sathya의 코드는 [여기] (https://ideone.com/yEeXHn) 코드를 참조하십시오. 처음에는 틀린 자리 표시자를 추가했습니다. 편집했습니다 –

+0

이 답변은 "하드 코딩 된 속성 키 이름"에 대해 도움이되지 않습니다 ... –