【发布时间】:2012-08-18 18:21:35
【问题描述】:
要重现此问题,请使用以下步骤。
- 创建一个新的 Grails 应用程序。
- 创建一个名为 FooController 的新控制器
- 向 FooController 添加操作“栏”
- 在 src/groovy 中,创建一个名为 Bar 的新类
-
在resources.groovy中配置一个名为bar的SpringBean
bar(Bar) {bean -> bean.autowire = 'byName' } - 启动应用程序并导航到 http:localhost:8080/[appContext]/foo/bar
- 你应该得到一个类似这样的堆栈跟踪:
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 和操作名称之间不应该有名称冲突。
【问题讨论】:
-
什么版本的 Grails,如果 2.x 是您的
bar操作是闭包还是方法? -
Grails 1.3.7,我也会尝试在 2.x 上重现该问题。
-
我在 Grails 2.0.3 上试过这个,它使用方法和闭包作为操作都可以正常工作。也许解决方案很明显:升级我用于项目的 Grails 版本。 :-) 我仍然想知道为什么会在 1.3.7 上发生这种情况……感谢您的评论。
-
在 Grails 2 中,action-as-methods 是首选方法,任何声明为闭包的操作都会在编译时通过 AST 转换处理到方法中。 Spring 仍在用自动装配的 bean 替换控制器的
bar属性的值,但是当通过 Web 请求调用操作时,它是运行的方法版本(它有自己的原始闭包代码副本)。跨度>
标签: grails classcastexception autowired grails-controller