我有一个运行 Spring Integration inbound-channel-adapter 的 Grails webapp,它被配置为接收电子邮件,并且有一个服务激活器来处理消息。该服务激活器根据业务规则提取电子邮件的各个部分,然后需要更新 Grails 域对象并将这些更改保存到数据库中。
Spring Integration 服务激活器代码片段:
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)
如果我改成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 服务激活器调用相同的操作。
有没有人想过如何把它联系在一起?