0

メールを受信するように構成されたSpringIntegrationinbound-channel-adapterを実行しているGrailsWebアプリがあり、メッセージを処理するサービスアクティベーターがあります。このサービスアクティベーターは、ビジネスルールに基づいて電子メールの一部を引き出し、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コードから直接、および機能を介してSpringIntegrationサービスアクティベーターから同じアクションを呼び出すことができますInvokeMethod

これをどのように結びつけるかについて誰かが考えたことはありますか?

4

1 に答える 1

2

今はInvokeHelperを使用しないでください。Grails2はコンパイル時にJavaの目的で署名を挿入します(動的ファインダーを除くが、理由は推測できます)。

Java Beanで、次を使用してnotificationCreationServiceを挿入します。

  • resources.groovy /xml+セッター

    また

  • コンストラクター+applicationContext(ApplicationContextAwareを実装)

そこに分析するバグがない場合は、サービス参照を使用すると機能するはずです。

サービスアクティベーターをどこで宣言しましたか?

于 2012-08-14T22:39:09.423 に答える