Служба Grails - метод вызова из контроллера? - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь вызвать метод службы 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 после этого является нулевой.

Что здесь не так?С моей стороны это может быть серьезной ошибкой, но я просто не могу понять, как это ...

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Мне кажется, что MetaProgramming Disaster ..

Ну, есть 3 теста для отладки:

_1) сначала попробуйте сделать

    println formatterService
    println formatterService.getClass()

просто чтобы проверить, является ли его внедренный компонент нужным, некоторые плагины иногда вводят компоненты, которые переопределяют значение по умолчанию.

_2) Убедитесь, что метод с именем "formatList" не внедряется в ваши службы через метапрограммирование с помощью какого-либо плагина или кода ядра.

Как это проверить, просто: Просто измените имя метода на нереалистичное, например: "formatListabcdewdw", а затем вызовите его. Если это работает, то его метод переопределяет проблему.

и если вы полнее энтузиазма, вы можете увидеть мета-методы по

println formatterService.metaClass.methods

_3) просто попробуйте сделать "params.format as String" в качестве последнего аргумента в вызове метода. \

.

Надеюсь, что все это поможет, пожалуйста, дайте мне знать о результатах, мне интересно знать .. :)

0 голосов
/ 09 декабря 2011

Я нашел проблему.Это связано с сигнатурой метода.

Распечатывая сообщение о сгенерированном исключении, оно гласит:

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)

Итак, ошибка новичка (желание передать TreeSet для списка) сопровождается слабой типизациейв Groovy ...: P

Я изменил сигнатуру метода на

def formatList ( items, String fmt) {

и назову ее

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

, и теперь она работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...