Grails服务 - 从控制器调用方法?

时间:2011-12-08 17:47:20

标签: grails service

我正在尝试从控制器调用grails服务上的方法,但看起来执行只是跳过方法调用。 我已尝试在方法内部使用断点调试应用程序,但它永远不会被命中。

我的服务(使用grails create-service生成)是:

class FormatterService {
    static transactional = false

    def formatList (List<Host>, String fmt) {
        OutputObject somePOGO = new OutputObject();
        (snip)
        return somePOGO
    }
}

然后在我的控制器上我有:

class HostController {
    def formatterService

    def getHostsByLabels = {
        (snip)
        OutputObject o = formatterService.formatList(someHosts,params.format)
        (snip)
    }
}

当应该在控制器中调用formatterService.formatList方法时,执行只是跳到下一行,没有输出打印到控制台,并且方法中的断点不会被命中。之后OutputObject o引用为null。

这里有什么问题?从我的角度来看,这可能是一个非常基本的错误,但我不能把手指放在它身上......

2 个答案:

答案 0 :(得分:1)

对我而言,这似乎是一个MetaProgramming灾难..

有三个要调试的测试:

_1)首先尝试做

    println formatterService
    println formatterService.getClass()

只是为了检查它的注入bean是否是所需的bean,有些插件有时会注入覆盖默认值的bean。

_2)确保名称 “formatList” 的方法不会通过任何插件或核心代码进行元编程注入您的服务。

如何测试这个很简单: 只需将方法的名称更改为某个Unrealistic One,例如:“formatListabcdewdw”,然后调用该名称。如果它工作,那么它的方法覆盖问题。

如果你更热情,你可以通过

看到metaMethods
println formatterService.metaClass.methods

_3)只是尝试将“params.format as String”作为方法调用中的最后一个参数。\

希望这些有帮助,请让我知道调查结果,我很想知道.. :)

答案 1 :(得分:0)

我发现了这个问题。它与方法签名有关。

打印出抛出的异常消息,它说:

No signature of method: hms.FormatterService.formatList() is applicable for argument types: (java.util.TreeSet, java.lang.String) values: (...) Possible solutions: formatList(java.util.List, java.lang.String)

所以,一个新手的错误(希望为List传递一个TreeSet)得到了Groovy中弱类型的帮助......:P

我已将方法签名更改为

def formatList ( items, String fmt) {

并将其命名为

def activeHosts = ...
OutputObject o = formatterService.formatList(activeHosts, params.format as String)

现在可行。