Может ли контроллер Grails расширяться от базового класса? Как сделать так, чтобы грааль не взрывался? - PullRequest
4 голосов
/ 30 мая 2010

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

Один из этих методов в базовом классе выглядит так:

def dynamicList(Class clazz) {
    def model = new LinkedHashMap()
    model[getMapString(clazz) + "s"] = list(clazz)
    model[getMapString(clazz) + "sTotal"] = count(clazz)

    model
}

Действие, которое вызывает его, также в базовом классе, таково:

def list = {
    dynamicList(clazz)
}

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

groovy.lang.MissingMethodException: No signature of method: groovy.lang.MissingMethodException.dynamicList() is applicable for argument types: (java.lang.Class) values: [class project
.user.User]

    at project.user.UserController$_closure1.doCall(UserController.groovy:18)

    at project.user.UserController$_closure1.doCall(UserController.groovy)

    at java.lang.Thread.run(Thread.java:619)

Как я могу нанести удар по голове и просто сказать, чтобы он делал то, что я хочу? Мои тестовые модули контроллера работают нормально, поэтому время работы Grails полностью неисправно: /

Ken

Ответы [ 3 ]

0 голосов
/ 02 июня 2010

Это весь код? Вы можете столкнуться с проблемами при вызове list() в dynamicList(), поскольку он соответствует действию. Другими словами, list() - это сокращение от list.call(), которое вызывает закрытие list.

Конечно, происходит нечто очень странное, потому что исключение говорит, что он не может найти метод dynamiclist() в классе MissingMethodException.

У вас есть воспроизводимый пример?

0 голосов
/ 20 декабря 2013

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

Хотя вы можете использовать композицию вместо расширения базового класса. Существует функция, которая позволяет вам легко внедрять сервисы в контроллеры, поэтому вы можете группировать сервисы по функциональности. введите описание ссылки здесь

Это старый вопрос, возможно, вы нашли ответ, или технология немного изменилась.

Автоматическое внедрение работает для служб и контроллеров и библиотек тегов.

0 голосов
/ 30 мая 2010

Вы уверены, что ваше наследство все в порядке, и вы чистили Граал и т.д.? Описанная вами ситуация должна нормально работать.

...