1

この問題を再現するには、次の手順を使用します。

  1. 新しいGrailsアプリケーションを作成します。
  2. FooControllerという新しいコントローラーを作成します
  3. FooControllerにアクション「バー」を追加します
  4. src / groovyで、Barという新しいクラスを作成します
  5. resources.groovyで、barというSpringBeanを構成します

    bar(Bar) {bean -> bean.autowire = 'byName' }

  6. アプリケーションを起動し、http:localhost:8080 / [appContext] / foo/barに移動します
  7. 次のようなスタックトレースを取得する必要があります。

java.lang.ClassCastException: Bar cannot be cast to groovy.lang.Closure at org.grails.plugin.resource.DevModeSanityFilter.doFilter(DevModeSanityFilter.groovy:44) at java.lang.Thread.run(Thread.java:680)'

なぜこれが起こっているのですか?それはGrailsのバグですか、それとも予想される動作ですか?

構成されたSpringBeanとアクション名の間に名前の衝突があってはならないと思います。

4

2 に答える 2

2

問題は、次のような Groovy 構文です。

class FooController {
  def bar = {
    // do something
  }
}

FooControllerクラスに 2 つの public メソッドを与える

public Object getBar() {
  return bar;
}

public void setBar(Object newBar) {
  bar = newBar;
}

メソッドの存在により、setBarSpring はそれをオートワイヤーされるプロパティと見なし、クロージャー値を Bean に置き換えます。Grails 自体は getter メソッドのみを必要とするため、代わりに

class FooController {
  final bar = {
    // do something
  }
}

(つまり、 であると宣言barしますfinal)、Groovy はセッターではなくゲッターのみを合成し、Spring はbarオートワイヤーできるプロパティとして認識しません。

于 2012-08-23T14:10:42.243 に答える
0

コントローラーのアクションはクロージャーであり、内部クラスに変換されます。あなたの Bean は同じ名前を持っているので、これによって名前の衝突が起こると思います。Bean またはアクションの名前を変更しようとしましたか?

于 2012-08-23T09:19:24.440 に答える