【问题标题】:How to set parameters on Groovy/Grails InvokeHelper.invokeMethod()如何在 Groovy/Grails InvokeHelper.invokeMethod() 上设置参数
【发布时间】: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


【解决方案1】:

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

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

  • resources.groovy/xml + setter

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

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

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

【讨论】:

  • 我将我的spring-integration-config.xml 导入到我项目的applicationContext.xml 中的web-app\WEB-INF 文件夹中。我大部分时间都在一个纯 Java 环境中度过,这就是我之前设置的方式。我是 Grails 的新手,所以如果有更好的方法在 Grails 中声明服务激活器,我很乐意学习它。 :-)
  • 优秀!这正是我所需要的。三天的头撞墙解决了将单个属性注入我的服务激活器。当您知道如何操作时,这很容易。 :-) 我最终不得不将我的 Spring Integration 配置从web-app\WEB-INF 移到grails-app\conf\spring\resources.xml。当它在web-app 中时,它找不到对notificationCreationService 的引用。谢谢!
猜你喜欢
  • 2021-11-16
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多