我正在尝试从控制器调用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。
这里有什么问题?从我的角度来看,这可能是一个非常基本的错误,但我不能把手指放在它身上......
答案 0 :(得分:1)
对我而言,这似乎是一个MetaProgramming灾难..
有三个要调试的测试:
_1)首先尝试做
println formatterService
println formatterService.getClass()
只是为了检查它的注入bean是否是所需的bean,有些插件有时会注入覆盖默认值的bean。
_2)确保名称 “formatList” 的方法不会通过任何插件或核心代码进行元编程注入您的服务。
如何测试这个很简单: 只需将方法的名称更改为某个Unrealistic One,例如:“formatListabcdewdw”,然后调用该名称。如果它工作,那么它的方法覆盖问题。
如果你更热情,你可以通过
看到metaMethodsprintln 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)
现在可行。