2017-10-26 8 views
0

클로저를 포함하는 빈 정의를 가질 수 있습니까? 때로는 거의 동일한 클래스 인스턴스를 원했지만 약간의 작은 동작으로 차별화되었습니다. 데이터 이외에 다른 bean 정의를 전달하는 것만으로는 충분하지 않습니다.grails bean 정의를 사용하여 스프링 빈에 클로저 전달하기

예 원하는 빈 정의 :

beans { 
    myCustomWidget1(Widget) { 
     myClosure = { w -> return w.doThis() } 
    } 

    myCustomWidget2(Widget) { 
     myClosure = { w -> return w.doThat() } 
    } 
} 

예 클래스 :

class Widget { 
    Closure myClosure 

    ... 
} 

문제는 Anonymous (Inner) Beans 이미 폐쇄 구문을 사용하고 이러한 익명 콩이 응용 프로그램 시작시 평가이다, 클래스의 Closure 필드를 설정하는 대신 이것은 분명히 런타임에 예외를 발생시킵니다.

이전에는 bean으로 삽입 한 작은 도우미 클래스를 만들었고 동작 변경 사항은 같은 이름의 메서드로 작성되었습니다. 나는 이것이 올바른 접근이라고 생각하지만보다 간결한 '그루비 (groovy)'방법을 기대했다.

우리는 Grails 2.4.2를 사용하고 있습니다. 그러나 grails/groovy 버전에 상관없이 BeanBuilder가 익명의 빈으로 내 원하는 클로저를 처리 할 것이라고 저는 믿습니다. 그것을 할 수

답변

1

한 가지 방법은 ... 대신의이 시도

beans { 
    myCustomWidget1(Widget) { 
     myClosure = { w -> return w.doThis() } 
    } 

    myCustomWidget2(Widget) { 
     myClosure = { w -> return w.doThat() } 
    } 
} 

... 내가 찾던 그냥 어떤

beans { 
    myCustomWidget1(Widget) { bean -> 
     bean.setPropertyValue 'myClosure', { w -> return w.doThis() } 
    } 

    myCustomWidget2(Widget) { bean -> 
     bean.setPropertyValue 'myClosure', { w -> return w.doThat() } 
    } 
} 
+0

, 감사합니다! – tylerwal