将应用程序从grails 2.0.x升级到2.4.x.

时间:2014-07-03 21:11:37

标签: spring grails

我遇到了实现InitializingBean接口的服务类的问题,因此实现了afterPropertiesSet方法。然后将服务注入控制器

在我的例子中,afterPropertiesSet方法引用了一个调用.list方法的域类

在2.0.4中一切顺利:在第一个控制器动作调用时调用afterPropertiesSet并正确执行

在2.4.2(同样在2.3中),在应用程序启动时调用afterPropertiesSet,并以异常失败

java.lang.IllegalStateException: Method on class [XXXXXX] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.

1 个答案:

答案 0 :(得分:2)

正如Graeme Rocher在JIRA中所阐明的那样:

这是因为在2.3.x及以上版本中,默认控制器范围是单例,而在2.0.x中,默认范围是原型。这里的区别在于,在2.3.x中,控制器是在启动时创建的,而在早期版本中,控制器仅在第一次请求时创建。

由于动态方法仅在初始化Spring上下文后注册,因此当调用afterPropertySet方法时,您处于某种中途状态。

然而,您可以通过使用以下方式再次制作控制器原型来回到以前的行为:

  

静态范围="原型"

在控制器类中。

有关控制器范围的更多信息(以及自grails 2.3以来默认范围的更改)可在grails documentation

中找到