2012-06-08 2 views
2

내가 나를 클래스와 함수 이름을 지정할 수 있습니다 Grails의에서 일반 함수를 작성하고, 그 기준에 따라 모든 함수 호출을 차단하기 위해 노력하고있어 :일반적인 방법 차단

getSomeClass().metaClass.invokeMethod = { String methodName, args -> 
    MetaMethod someAction = getSomeClass().metaClass.getMetaMethod(methodName, args) 
    def result = someAction.invoke(delegate, args) 
    if (methodName==getSomeMethodName()) 
     intercept(args, result) 
    return result 
} 

이것은 POGO 및 도메인 클래스에서 작동하지만 컨트롤러 클래스에서는 작동하지 않습니다. Grails에서 사용할 수있는 컨트롤러 인터셉터와 필터가 있다는 것을 완전히 알고 있지만 이것들은 내가 달성하고자하는 것을 실제로 중앙 집중화하지 않으며 일부 중앙 집중식 동작을위한 간단한 제네릭 함수를 만들려고 시도했습니다.

왜이 컨트롤러에서 작동하지 않습니다, 감사합니다

+0

컨트롤러에서 메소드 또는 클로저를 사용하여 요청을 바인딩합니까? 위의 코드는 Closure 구문 기반 Grails 컨트롤러에서는 작동하지 않습니다. – stefanglase

+0

고마워요 @stefanglase, 내 컨트롤러 내 작업에 대한 방법을 사용하고있다 – crebbo

+0

내 기본 질문은 왜 MyController.metaClass.invokeMethod = {String methodName, args ->} 도메인 개체 및 다른 포고 – crebbo

답변

3

귀하의 접근 방식은 그루비 메타 클래스 메커니즘을 통해 만들어진 메서드 호출을 위해 작동하지만 Grails의 2에서이 작업을 컨트롤러에 적용되지 않습니다 - 그들은 일반 자바 반사 (java.lang.reflect.Method.invoke)를 사용하여 호출, 따라서 사용자 정의 invokeMethod있어 바이 패스됩니다.

자바와 Groovy에서 호출 할 수있는 AOP 메커니즘을 원한다면 AspectJ 로딩 타임과 같은 것을 사용해야 할 것이다. Spring의 프록시 기반 AOP는 작동 할 수 있지만 Grails 2 컨트롤러 시스템은 특정 @Action 주석 (AST 변환으로 컴파일 타임에 추가됨)이있는 작업 메소드에 의존하며 Spring AOP 프록시가 메소드 주석을 유지할지 여부를 알지 못합니다. 생성 된 프록시 메소드의 target 클래스

0

정의 후 grails 프레임 워크에 의해 덮어 쓸 수 있습니다수 있습니까?

MyController.metaClass.invokeMethod의 내용을 리플렉션을 통해 확인하려고 했습니까?