0

我有一个运行 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 服务激活器调用相同的操作。

有没有人想过如何把它联系在一起?

4

1 回答 1

2

您现在不应该使用 InvokeHelper,Grails 2 在编译时为 Java 目的注入签名(动态查找器除外,但您可以猜到原因)。

在您的 Java bean 中,我将使用以下方法注入 notificationCreationService:

  • 资源.groovy/xml + setter

    或者

  • 构造函数+applicationContext(实现ApplicationContextAware)

使用服务参考应该可以工作,如果没有,那里有要分析的错误。

你在哪里声明你的服务激活器?

于 2012-08-14T22:39:09.423 回答