Grails会话作用域服务,单例代理在控制器中变为null

Grails会话作用域服务,单例代理在控制器中变为null,grails,Grails,我在Grails2.3.7上创建了一个简单的应用程序来显示我的问题 我在整个应用程序中只创建了一个控制器和一个服务。这是我的TestController.groovy: package testsession class TestController { def testingsessionServiceProxy def index() { println testingsessionServiceProxy.getSomeVariable() } }

我在Grails2.3.7上创建了一个简单的应用程序来显示我的问题

我在整个应用程序中只创建了一个控制器和一个服务。这是我的TestController.groovy:

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可能不会添加该代理属性。它只有在你添加插件后才会出现。顺便说一句,我用过这个插件,但没有用:(