【问题标题】:Grails session scoped services with singleton proxy getting null in controller具有单例代理的 Grails 会话范围服务在控制器中为空
【发布时间】:2015-04-04 02:30:19
【问题描述】:

我在 Grails 2.3.7 上创建了一个简单的应用程序来显示我的问题。

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

package testsession

class TestController {
    def testingsessionServiceProxy
    def index() {
        println testingsessionServiceProxy.getSomeVariable()
    }
}

我的 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 中为 testingsessionServiceProxy 获得了空值。请参阅下面的跟踪:

....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

【问题讨论】:

    标签: grails


    【解决方案1】:

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

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

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

    查看描述问题的this article。还有一个plugin提供了这个功能,但是我没有测试过。

    【讨论】:

    • 我看过那篇文章。说 grails 1.3 默认情况下会这样做,这非常令人困惑。也许 grails 2.3 默认情况下不会添加该代理属性。它仅在您添加插件后出现。顺便说一句,我使用过插件,但没用:(
    【解决方案2】:

    你的实际服务是 TestingsessionService 但你已经注入了一些东西..

    def testingsessionServiceProxy
    

    尝试注入并寻找价值

    def testingsessionService 
    

    紧随其后

    testingsessionService.getSomeVariable()
    

    另外,你有 @Transactional 用于整个类,但你没有做任何数据库工作,只有在它的整个类除了数据库工作之外什么都不做,或者根据实际需要的服务定义设置它时才使用它它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      相关资源
      最近更新 更多