grails - 如何在 Groovy/Grails InvokeHelper.invokeMethod() 上设置参数

标签 grails groovy spring-integration

我有一个运行 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 Action 的定义。 InvokeHelper还有其他几种调用方法以及设置不同属性的方法,但是我还没有找到使这项工作的神奇组合,并且就 InvokeHelper 的示例代码而言,任何互联网搜索都很少出现。

理想情况下,Grails 操作不会是静态的,它会使用标准 params机制。这将允许我直接从 Grails 代码以及通过 InvokeMethod 的 Spring Integration 服务激活器调用相同的操作。功能。

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

最佳答案

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

  • 资源.groovy/xml + setter
    或者
  • 构造函数+applicationContext(实现ApplicationContextAware)

  • 使用服务引用应该可以工作,如果没有,那里有要分析的错误。
    你在哪里声明你的服务激活器?

    关于grails - 如何在 Groovy/Grails InvokeHelper.invokeMethod() 上设置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11942774/

    相关文章:

    java - Spring Integration Zookeeper - 我目前是领导者吗

    spring - 如何在XML配置中使用Spring集成中的相对路径

    json - Grails-向现有的Map域类成员添加新的默认值

    maven-2 - grails 无法从 maven repo 下载 jar

    grails - Grails是否适合生产?

    grails - 如何使用Grails GORM进行多个字段匹配的左外部联接?

    grails - 迭代可能是字符串或字符串数​​组的 Groovy 对象

    grails - Grails集合

    java - 如何在项目编译之前将projectS的源代码复制到项目中?

    java - 持久订阅 ActiveMQ