Groovy의 ConfigSlurper에서 객체를 바인딩 할 수 있었지만 메소드는 바인딩 할 수 없었습니다. 그게 가능하지 않니?메소드를 바인딩 변수로 Groovy의 ConfigSlurper에 전달하는 방법은 무엇입니까?
여기
String conf = """
k1 = "v1"
environments{
prod{
person.create("prod.id1"){
name = "prod.name1"
}
}
dev {
person.create("dev.id1"){
name = "dev.name1"
}
}
}
environments{
prod{
create("prod.id2"){
name = "prod.name2"
}
}
dev {
create("dev.id2"){
name = "dev.name2"
}
}
}
"""
def parser = new ConfigSlurper("prod")
Person person1 = new Person()
Person person2 = new Person()
parser.setBinding([person: person1, // <-- SUCCESS
create: person2.&create]) // <-- NOT SUCCESS?
println parser.parse(conf)
println "person1=${person1.dump()}"
println "person2=${person2.dump()}"
class Person{
String id
String name
public void create(String id, Closure c){
this.id = id
this.with(c)
}
}
출력이
[k1:v1, create:prod.id2, create.name:prod.name2]
person1=<[email protected] id=prod.id1 name=prod.name1>
person2=<[email protected] id=null name=null>
이 예에서는 어떤 디자인 결함을 무시하십시오 인 예입니다.
person
이 바인딩에 정의되어 있으며
create
이
getProperty('person')
에 의해 반환 된 객체에 정의되어 있기 때문에
'create.call() {}'을 (를) 사용해보십시오 – Dany
달성하고자하는 것을 공유해 주시겠습니까? 아마도'ConfigSlurper'는 처음부터 그것을 할 올바른 방법이 아닙니다. – Dany
@Dany Thanks,'.call()'이 작동합니다. 나는 DSL을 설계 할 계획이며 요구 사항 중 하나는 환경 특이성을 지원하는 것이다. 'create.call (..)'이 작동하는 동안,'call'을 사용할 필요가 없게하는 방법이 있습니까? – phani