전자 메일을 수신하도록 구성된 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 서비스 액티베이터에서 직접 동일한 작업을 호출 할 수 있습니다.
누구도 이것을 어떻게 묶을 생각이 있습니까?
[Java 서비스 레이어에서 Grails 도메인 클래스에 액세스하는 방법] (http://stackoverflow.com/questions/2717098/how-to-access-grails-domain-classes-in- java-service-layer) – GeoGriffin
이 문제를 해결하기 위해 당신이해야 할 일이 무엇인지 알지 못합니다 만 근본적인 문제는 정적 서비스 메소드를 잘 호출한다고 생각하지만 NotificationMessage 클래스는 GORM에 의해 꾸며지지 않았습니다 저장 방법 등추측해야만한다면 Spring 코드에는 Grails를 실행하는 클래스 로더와 다른 클래스 로더에로드 된 다른 버전의 NotificationMessage가 있습니다. 그러나 이것은 추측입니다. –
기본적으로 ... Java 코드에서 정적 조치를 호출하면 매개 변수가 올바르게 읽히지 만 도메인 오브젝트는 save() 조치로 장식되지 않습니다. Java 코드에서 비 정적 액션을 호출하면 params *는 올바르게 읽히지 않지만 save()는 예상대로 작동합니다. – GeoGriffin