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 中的错误还是预期的行为?

我希望配置的 SpringBeans 和操作名称之间不应该有名称冲突。

4

2 回答 2

2

问题是 Groovy 语法像

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

FooController类两个公共方法

public Object getBar() {
  return bar;
}

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

setBar方法的存在使 Spring 将其视为要自动装配的属性,并用您的 bean 替换闭包值。Grails 本身只需要 getter 方法,所以如果你说

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

(即声明barfinal)然后Groovy 将只合成getter 而不是setter,Spring 不会将bar其视为可以自动装配的属性。

于 2012-08-23T14:10:42.243 回答
0

控制器中的动作是一个闭包,它被转换为一个内部类。你的bean有相同的名字,所以我相信你是通过这个来命名冲突的。您是否尝试重命名 bean 或操作?

于 2012-08-23T09:19:24.440 回答