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

时间:2015-04-02 12:40:26

标签: grails

我在Grails 2.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
    }
}

在运行此应用程序时,我在TestController.groovy中为testssessionServiceProxy获取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

2 个答案:

答案 0 :(得分:1)

据我所知,此功能计划在Grails 3.1中实现。看一下这张票:GRAILS-5701

但您可以通过在resources.groovy中定义代理手动创建代理,如下所示:

testingsessionServiceProxy(ScopedProxyFactoryBean) {
    targetBeanName = 'TestingsessionService'
    proxyTargetClass = true
}

查看描述问题的this article。还有plugin提供此功能,但我还没有测试过它。

答案 1 :(得分:0)

您的实际服务有一些是TestingsessionService,但您注入了..

def testingsessionServiceProxy

尝试注入并在

中寻找值
def testingsessionService 

接着是

testingsessionService.getSomeVariable()

你也有@Transactional,它适用于整个类,但你做的没有数据库工作,只有这样才能使用它,如果除了数据库工作之外什么都不做,或者按照实际需要的服务定义设置它它