【发布时间】:2012-08-13 21:44:00
【问题描述】:
我有一个运行 Spring Integration inbound-channel-adapter 的 Grails webapp,它被配置为接收电子邮件,并且有一个服务激活器来处理消息。该服务激活器根据业务规则提取电子邮件的各个部分,然后需要更新 Grails 域对象并将这些更改保存到数据库中。
Spring集成服务激活码sn-p:
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 操作 sn-p:
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)
如果我将createNotification() 更改为不是static,那么我会得到以下信息:
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 服务激活器调用相同的操作。
有没有人想过如何将它们联系在一起?
【问题讨论】:
-
我不知道你需要做什么来解决这个问题,但我认为根本问题是你调用静态服务方法很好,但 NotificationMessage 类没有被 GORM 修饰为有保存方法等。如果我不得不猜测,我会说您的 Spring 代码在不同的类加载器中加载了与运行 Grails 的不同版本的 NotificationMessage。但这是一个猜测。
-
基本上...如果我从 Java 代码调用静态操作,参数会被正确读取,但域对象不会用 save() 操作修饰。如果我从 Java 代码调用非静态操作,则参数 未正确读取,但 save() 按预期工作。
标签: grails groovy spring-integration