2013-04-05 3 views
1

기존 Java/Spring 응용 프로그램을 grails 응용 프로그램에 통합하려고합니다. 이 코드는 레거시 앱 컨텍스트 항목을 연결하는 경우 사용할 수없는 것으로 보이는 많은 맞춤 속성을 사용합니다.Grails 속성 초기화

Config.groovy에서 개별적으로로드하면 작업이 시작되지만 (레거시 속성 객체를로드하여 grails config에 삽입하는 것을 의미합니다).

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 부트 스트랩 초기화가 너무 늦은 것 같습니다. appContext는 이미 그 시점에서 새로 고쳐졌으며 해결되지 않은 속성에 대한 예외가 발생했습니다. 내

+0

이 속성을 사용자 지정 파일에 저장하거나 사용자 지정 클래스로 저장합니까? –

+0

맞춤 클래스/데이터 형식입니다. 속성 개체로 속성을 노출 할 수있는 bean이 있습니다. – rongenre

답변

5

당신의 Config.groovy 어떤 점을 포함하지 않는 속성 이름을 위해 일하는 것이

Properties legacyProps = // whatever you need to do to load the legacy properties 
for(String propName in legacyProps.stringPropertyNames()) { 
    setProperty(propName, legacyProps.getProperty(propName)) 
} 

같은 기본적인 트릭을 할 수 있습니다. 점을 포함 할 속성은 Grails의 설정에 추가 될 것입니다하지만 당신은 그들이 당신이 할 수있는 적절한 계층 형태로 추가하려면

grailsApplication.config.property.with.dots 

반대로에만 플랫 키, 계층되지는

grailsApplication.config.'property.with.dots' 

을 즉 제공 그루비 트릭 당신은 즉,

my.app.foo=bar 
my.app.bar=baz 
다른 접두사 하나 키가 기존 속성에서 어떤 경우가 없다는 것을 확신 할 수 않는 것이

는 OK이지만,

my.app.foo=bar 
my.app=baz 

확인하지 않습니다. 속성이이를 만족시키는 경우 다음을 시도하십시오.

Properties legacyProps = // whatever you need to do to load the legacy properties 
for(String propName in legacyProps.stringPropertyNames()) { 
    String[] propParts = propName.split(/\./) 
    if(propParts.size() == 1) { 
    // no dots 
    setProperty(propName, legacyProps.getProperty(propName)) 
    } else { 
    // we have dots - get the first segment (which is a ConfigObject) 
    ConfigObject co = getProperty(propParts[0]) 
    if(propParts.size() > 2) { 
     // then apply all but the last segment to that to get the last parent 
     co = propParts[1..-2].inject(co) { o, part -> o."${part}" } 
    } 
    // then set final segment on the last parent ConfigObject 
    co."${propParts[-1]}" = legacyProps.getProperty(propName) 
    } 
}