Grails会话作用域服务,单例代理在控制器中变为null
我在Grails2.3.7上创建了一个简单的应用程序来显示我的问题 我在整个应用程序中只创建了一个控制器和一个服务。这是我的TestController.groovy:Grails会话作用域服务,单例代理在控制器中变为null,grails,Grails,我在Grails2.3.7上创建了一个简单的应用程序来显示我的问题 我在整个应用程序中只创建了一个控制器和一个服务。这是我的TestController.groovy: package testsession class TestController { def testingsessionServiceProxy def index() { println testingsessionServiceProxy.getSomeVariable() } }
package testsession
class TestController {
def testingsessionServiceProxy
def index() {
println testingsessionServiceProxy.getSomeVariable()
}
}
My TestingsessionService.groovy:
package testsession
import grails.transaction.Transactional
@Transactional
class TestingsessionService {
static scope="session"
static proxy=true
def somevariable=false
def getSomeVariable() {
somevariable
}
}
运行此应用程序时,testingsessionServiceProxy的TestController.groovy中的值为null。请参见下面的跟踪:
....Error
|
2015-04-02 18:09:28,122 [http-bio-8080-exec-7] ERROR errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [GET] /TestSession/test/index
Cannot invoke method getSomeVariable() on null object. Stacktrace follows:
Message: Cannot invoke method getSomeVariable() on null object
Line | Method
->> 6 | index in testsession.TestController
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 200 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
据我所知,这个特性计划在Grails3.1中实现。请看这张票: 但您可以通过在
resources.groovy
中定义代理来手动创建代理,如下所示:
testingsessionServiceProxy(ScopedProxyFactoryBean) {
targetBeanName = 'TestingsessionService'
proxyTargetClass = true
}
请看,其中描述了问题。还有一个提供此功能的服务,但我尚未对其进行测试。您的实际服务正在测试SessionService,但您已经注入了一些东西
def testingsessionServiceProxy
尝试注入并在中寻找价值
def testingsessionService
接
testingsessionService.getSomeVariable()
另外,您还有@Transactional,它适用于整个类,但您不做任何db工作,只有在整个类只做db工作时才使用它,或者根据实际需要的服务定义设置它。我看过这篇文章。如果说Grails1.3在默认情况下做到了这一点,那是非常令人困惑的。默认情况下,Grails2.3可能不会添加该代理属性。它只有在你添加插件后才会出现。顺便说一句,我用过这个插件,但没有用:(