Grails 2.4控制器中的服务调用,但服务为空?

时间:2015-07-23 13:19:35

标签: web-services grails

此示例程序抛出folling nullpointer Exception:

    2015-07-23 15:12:36,815 [http-bio-8090-exec-2] ERROR errors.GrailsExceptionResolver  - NullPointerException occurred when processing request: [GET] /GrailsProject/HTMLAnalyser/start
Cannot invoke method analyse() on null object. Stacktrace follows:
Message: Cannot invoke method analyse() on null object
    Line | Method
->>   14 | start     in org.Bookstore.HTMLAnalyserController$$EPJGWngM
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    198 | 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

我有这个控制器:

package org.Bookstore

import org.Bookstore.HTMLAnalyserService

class HTMLAnalyserController {

    def htmlAnalyserService

    def index() { }

    def start() {

        def html = "START"
        html = htmlAnalyserService.analyse()
        render html
    }

}

我有这项服务:

package org.Bookstore

import grails.transaction.Transactional

@Transactional
class HTMLAnalyserService {

    def serviceMethod() {

    }

    def analyse() {
        println "ok"
        def map = [:]
        map.put("key", "value")
        map.put("key2", "value2")
        return map
    }
}

我使用grails命令行工具创建了控制器和服务。 有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

原因是名称为HTMLAnalyserService的类的属性名称为HTMLAnalyserService(即相同)。

那是因为HTML被假定为首字母缩略词(因为全部为大写),因此没有下降。如果您的类名称为HtmlAnalyserService,则确实会对名为htmlAnalyserService的属性执行依赖项注入。

测试依赖注入的正确名称的快速方法是使用方法grails.util.GrailsNameUtils#getPropertyName(参见http://grails.github.io/grails-doc/2.2.x/api/grails/util/GrailsNameUtils.html#getPropertyName(java.lang.Class))。

import static grails.util.GrailsNameUtils.*
assert getPropertyName('HtmlAnalyserService') == 'htmlAnalyserService'
assert getPropertyName('HTMLAnalyserService') == 'HTMLAnalyserService'

您也可以将课程传递给它。

答案 1 :(得分:-1)

我找到了答案:

要使Grails依赖注入工作,您需要将变量命名为类名

所以对我来说,我必须写:

def HTMLAnalyserService 

而不是def htmlAnalyserService(行为suxx)

甚至

HTMLAnalyserService xxx 
xxx.analyse()

不工作

org.Bookstore.HTMLAnalyserService xxx
xxx.analyse()

没有工作,但GGTS显示我变量很好