2010-03-25 2 views
1

나는 예를 들어, 컨트롤러, 나는 테이블의 레코드 수를 얻을 수도메인 클래스 정적 메서드가 grails "서비스"내부에서 작동하지 않는 이유는 무엇입니까?

IncomingCall.count() 

를 호출 할 수있는 등

하는 Grails의 서비스를 쿼리, 도메인 정적 메서드에 액세스 할 수있게하려면 "IncomingCall"

하지만 서비스 내부에서이 작업을 수행하려고하면, 나는 오류 얻을 :

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'incomingStatusService': Invocation of init method failed; nested exception is groovy.lang.MissingMethodException: No signature of method: static ms.wdw.tropocontrol.IncomingCall.count() is applicable for argument types:() values: [] 

어떻게 이러한 방법은 주입합니까? 이를 수행하는 컨트롤러에는 마법 def 문이 없습니다. 또는 내 서비스 클래스에서 Hibernate를 사용할 수 없다는 문제가 있습니까?

나는 또한이 방법을 시도 :

import ms.wdw.tropocontrol.IncomingCall 
import org.codehaus.groovy.grails.commons.ApplicationHolder 

// ... 

void afterPropertiesSet() { 

    def count = ApplicationHolder.application.getClassForName("IncomingCall").count() 
    print "Count is " + count 
} 

를 실패했습니다. ApplicationHolder.application.getClassForName ("IncomingCall")이 null을 반환했습니다. 이걸 너무 일찍 부르니? 호출 할 수있는 "late init"이 있습니까? 나는 그것이 "afterPropertiesSet()"의 목적이라고 생각했다. ...

+1

당신이 포함 된 패키지를 포함하려고 했습니까 (예를 들어, Grails의 서비스 문서에서) __IncomingCall__ 도메인을 서비스 소스에 추가 하시겠습니까? – Jack

+0

예. 나는 그것을위한 import 문을 가지고있다. –

답변

0

진짜 대답은, 내가 발견,이 작업을 수행하지 않는 것입니다.

내 도메인 클래스에 내 서비스를 삽입하고 거기에서 호출해야합니다.

class Deal { 
    def authenticateService 

    def afterInsert() { 
     def user = authenticateService.userDomain(); 
     .... 
    } 
.... 
} 

을 필요에 따라 afterInsert 내 서비스 메서드를 호출하는 것처럼

나는 "트리거"방법을 사용할 수 있습니다

5

메타 클래스 메소드는 Spring 애플리케이션 컨텍스트가 구성된 후에 유선화되므로 afterPropertiesSet에서 호출하려고하면 실패 할 것이다. 대신 당신은 정기적으로 초기화() 메소드를 생성하고 부트 스트랩에서 해당 호출 할 수 있습니다 :

import ms.wdw.tropocontrol.IncomingCall 

class FooService { 

    void init() { 
     int count = IncomingCall.count() 
     println "Count is " + count 
    } 
} 

를이와 그 전화 :

class BootStrap { 

    def fooService 

    def init = { servletContext -> 
     fooService.init() 
    } 
} 
+0

대단히 고마워요! 그리고 부트 스트랩 클래스에 무언가를 추가 할 생각이 없었기 때문에 나는 물었습니다. –

+0

그리고 이것은 작동합니다. "init"메서드에서 작업자 스레드를 시작하고 그에서 내 도메인 클래스 동적 메서드에 액세스 할 수 있습니다 .... –

관련 문제