2009-06-26 2 views
0

Grails 애플리케이션에서 모든 컨트롤러 클래스에 foo() 메소드를 추가하고 싶습니다. 나는 다음과 같은 코드를 사용하여 플러그인의 doWithDynamicMethods 폐쇄 내에서이 작업을 수행 할 수 있다는 사실을 알고 :컨트롤러에 메소드 추가하기

application.controllerClasses.toList()*.metaClass*.foo = { println 'foo called' } 

그러나, 난 그냥이 목적을 위해 플러그인을 만들려고하지 않습니다. 내가 할 수있는 다른 곳이 있나. 나는 BootStrap.groovyinit 클로저 내에서 가능할 것이라고 생각하지만이 클로저에서 GrailsApplication 인스턴스에 액세스하는 방법을 알지 못합니다.

감사합니다, 돈

+0

왜 플러그인을 작성하지 않습니까? 이것은 플러그인을위한 유즈 케이스의 완벽한 유형입니다. 당신은 그것을 풀어 줄 필요가 없으며 커다란 플러그인이어야합니다. 플러그인을 통해 모듈화하는 것은 가능하다면 따라야하는 위대한 관용구입니다. – Chii

답변

2
def grailsApplication = org.codehaus.groovy.grails.commons.ApplicationHolder.application 
-2
class BootStrap { 
    def grailsApplication 

    def init = { servletContext -> 
     ... 
    } 
} 
+1

그게 무슨 뜻입니까? – dmahapatro

0

문제는 나의 대답은 그 당시에는 불가능했을 수도, 오래 전에 요청했다 -하지만 지금은 2014 년 4 월의이 코드는 가장 간단한을 보여줍니다 (BootStrap.init 내에서) 모든 컨트롤러에 방법을 추가하는 방법 :

grailsApplication.controllerClasses.each { controllerClass -> 
    if (controllerClass.clazz.name.contains("org.idurkan.foo")) { 
     controllerClass.metaClass.respondError = { String message, int status = 404 -> 
      response.status = status 
      render([errorMessage: message] as JSON) 
     } 
    } 
} 
  1. BootSt에서 rap.groovy, grailsApplication을 다음과 같이 삽입하십시오 : def grailsApplication
  2. 위와 같은 호출을하여 자신의 패키지 이름을 대체하십시오 - 플러그인 클래스를 어지럽히는 것을 피하십시오.
  3. 이제 모든 컨트롤러에서 repondError 클로저 (메서드처럼 호출)를 사용할 수 있습니다.

참고 사항이 작업을 추가하지는 않습니다! 그것은 단지 컨트롤러에서 사용할 수있는 유틸리티 종료/방법입니다.

관련 문제