我遇到了实现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.
答案 0 :(得分:2)
正如Graeme Rocher在JIRA中所阐明的那样:
这是因为在2.3.x及以上版本中,默认控制器范围是单例,而在2.0.x中,默认范围是原型。这里的区别在于,在2.3.x中,控制器是在启动时创建的,而在早期版本中,控制器仅在第一次请求时创建。
由于动态方法仅在初始化Spring上下文后注册,因此当调用afterPropertySet方法时,您处于某种中途状态。
然而,您可以通过使用以下方式再次制作控制器原型来回到以前的行为:
静态范围="原型"
在控制器类中。
有关控制器范围的更多信息(以及自grails 2.3以来默认范围的更改)可在grails documentation
中找到