2012-08-13 2 views
0

전자 메일을 수신하도록 구성된 Spring 통합 인바운드 - 채널 어댑터를 실행하는 Grails 웹 응용 프로그램이 있으며 메시지를 처리하는 서비스 활성화자가 있습니다. 이 서비스 액티베이터는 비즈니스 규칙에 따라 이메일의 일부분을 추출한 다음 Grails 도메인 객체를 업데이트하고 변경 사항을 데이터베이스에 저장해야합니다.Groovy/Grails에 매개 변수를 설정하는 방법 InvokeHelper.invokeMethod()

봄 통합 서비스 활성화 코드 :

HashMap<String, Serializable> params = new HashMap<String, Serializable>(); 
params.put("notification", notification); 
params.put("notificationType", notificationType); 
params.put("sender", notificationSender); 
InvokerHelper.invokeMethod(NotificationCreationService.class, "createNotification", params); 

Grails의 NotificationCreationService 액션 조각 :

def static createNotification() { 
    if (params.notification != null && params.notificationType != null && params.sender != null) { 
     String notification = params.get("notification") as String 
     NotificationType notificationType = params.get("notificationType") as NotificationType 
     String sender = params.get("sender") as String 

     def NotificationMessage notificationMessage = null 
     notificationMessage = new NotificationMessage() 
     notificationMessage.notification = notification 
     notificationMessage.save(flush: true) 
     ... 
    } 
} 

NotificationMessage

오류가 생성 표준 Grails의 도메인 클래스 :

org.springframework.integration.MessageHandlingException: 
    groovy.lang.MissingMethodException: No signature of method: mycompany.pyproject.mypackage.NotificationMessage.save() is applicable for argument types:() values: [] 
    Possible solutions: save(), save(boolean), save(java.util.Map), wait(), any(), wait(long) 

내가하지 다음 static 그때 내가 할 수 createNotification()을 변경하는 경우 :

org.springframework.integration.MessageHandlingException: 
    groovy.lang.MissingMethodException: No signature of method: static mycompany.pyproject.mypackage.NotificationCreationService.createNotification() is applicable for argument types: (java.util.HashMap) values: [...]  
    Possible solutions: createNotification(java.util.HashMap), createNotification(java.lang.String, napa.changedetection.alert.NotificationType, java.lang.String) 

내가 해봤 다른 InvokeHelper.invokeMethod()의 조합과 유사한 결과와 Grails의 조치의 정의. InvokeHelper에는 다른 속성을 설정하는 것 외에도 메서드를 호출하는 몇 가지 다른 메서드가 있지만이 작업을 수행하는 마법 조합을 찾지 못했으며 검색된 모든 인터넷은 InvokeHelper의 예제 코드까지 거의 나타나지 않았습니다.

이상적으로 Grails 동작은 정적이 아니며 표준 params 메커니즘을 사용하는 것이 이상적입니다. 이렇게하면 Grails 코드뿐만 아니라 InvokeMethod 기능을 통해 Spring Integration 서비스 액티베이터에서 직접 동일한 작업을 호출 할 수 있습니다.

누구도 이것을 어떻게 묶을 생각이 있습니까?

+0

[Java 서비스 레이어에서 Grails 도메인 클래스에 액세스하는 방법] (http://stackoverflow.com/questions/2717098/how-to-access-grails-domain-classes-in- java-service-layer) – GeoGriffin

+0

이 문제를 해결하기 위해 당신이해야 할 일이 무엇인지 알지 못합니다 만 근본적인 문제는 정적 서비스 메소드를 잘 호출한다고 생각하지만 NotificationMessage 클래스는 GORM에 의해 꾸며지지 않았습니다 저장 방법 등추측해야만한다면 Spring 코드에는 Grails를 실행하는 클래스 로더와 다른 클래스 로더에로드 된 다른 버전의 NotificationMessage가 있습니다. 그러나 이것은 추측입니다. –

+0

기본적으로 ... Java 코드에서 정적 조치를 호출하면 매개 변수가 올바르게 읽히지 만 도메인 오브젝트는 save() 조치로 장식되지 않습니다. Java 코드에서 비 정적 액션을 호출하면 params *는 올바르게 읽히지 않지만 save()는 예상대로 작동합니다. – GeoGriffin

답변

2

InvokeHelper를 사용하면 안됩니다. Grails 2는 자바 파인더를 사용하여 컴파일 할 때 서명을 삽입합니다 (동적 파인더는 제외하지만 이유를 추측 할 수 있음). 자바 빈에서

내가 사용 notificationCreationService 주입하는 것 :

  • resources.groovy/XML + 세터

    또는

  • 생성자 + ApplicationContext를

(ApplicationContextAware를 구현) 서비스 레퍼런스를 사용하는 것이 효과가있다. 그렇지 않으면 분석 할 버그가있다.

서비스 활성화 담당자는 어디에서 신고 했습니까?

+0

내 프로젝트의 'web-app \ WEB-INF' 폴더에있는'applicationContext.xml'에'spring-integration-config.xml'을 가져옵니다. 나는 곧바로 Java 환경에서 대부분의 시간을 보냅니다. 그래서 이전에 설정 한 방법입니다. 나는 Grails에 익숙하지 않기 때문에, Grails에서 서비스 액티베이터를 선언하는 더 좋은 방법이 있다면, 그것을 배우게되어 기쁩니다. :-) – GeoGriffin

+0

뛰어난! 이것은 내가 필요한 것입니다. 벽에 머리를 두들 기는 3 일이 내 서비스 활동가에게 하나의 재산을 주입하는 것으로 해결되었습니다. 방법을 알면 쉽습니다. :-) 'web-app \ WEB-INF'에서 Spring 통합 구성을'grails-app \ conf \ spring \ resources.xml'로 이동해야했습니다. 'web-app'에있을 때,'notificationCreationService'에 대한 참조를 찾을 수 없습니다. 감사! – GeoGriffin

관련 문제