Grails: сервис не внедряется в контроллер при запуске плагина - PullRequest
0 голосов
/ 07 июня 2019

Я создаю плагин Grails (3.3.9) для хранения общего внутреннего кода для некоторых внутренних приложений.По какой-то причине, когда я запускаю плагин для его тестирования, мой сервис не внедряется в мой контроллер.

Я начал с профиля веб-плагина по умолчанию, создал отдельный класс домена с именем Entry изапустите generate-all для создания контроллера, службы и представлений.Когда я пытаюсь запустить свой плагин как приложение и просматривать отдельный экземпляр домена, я получаю следующую ошибку:

Cannot invoke method get() on null object. Stacktrace follows:

java.lang.reflect.InvocationTargetException: null
    at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
    at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
    at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
    at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
    at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Cannot invoke method get() on null object
    at com.mycompany.internal.EntryController.show(EntryController.groovy:18)
    ... 14 common frames omitted

Stacktrace переводит меня на строку 18 в моем контроллере:

def show(Long id) {
    respond entryService.get(id)
}

Это подсказывает мне, что entryService равно нулю.

Мой класс домена выглядит следующим образом:

class Entry {

    String entryCode
    String description
}

Контроллер выглядит следующим образом:

class EntryController {

    EntryService entryService

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

    def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        respond entryService.list(params), model:[entryCount: entryService.count()]
    }

    def show(Long id) {
        respond entryService.get(id)
    }

    //snipped for brevity

И сервис выглядит следующим образом:

@Service(Entry)
interface EntryService {

    Entry get(Serializable id)

    //snipped for brevity

}

Основываясь на документации плагина Grails, я ожидал, что смогу запустить плагин автономно, как любое другое приложение, и в обычных приложениях, определяя сервис как интерфейсработает отлично.Если я установлю этот плагин в свой локальный кэш maven и использую его в приложении, он будет работать именно так, как я и ожидал;Я могу подключиться к конечной точке show контроллера и получить результат из своей базы данных.

В какой-то момент я попытался реализовать службу как класс, а не как интерфейс, но затем я получил этоошибка:

URI
/entry/index
Class
java.lang.IllegalStateException
Message
null
Caused by
Either class [com.mycompany.internal.Entry] is not a domain class or GORM has not been initialized correctly or has already been shutdown. Ensure GORM is loaded and configured correctly before calling any methods on a GORM entity.

Что мне не хватает, как правильно настроить и запустить плагин Grails?

1 Ответ

0 голосов
/ 10 июня 2019

Наконец-то нашел ответ, покопавшись в проблеме GORM: Класс Authority не является классом домена, или GORM не был правильно инициализирован или уже завершил работу

Очевидно, корень проблемы заключался в необходимости добавить compile "org.grails.plugins:hibernate5" к моему dependencies блоку в build.gradle. Странно то, что профиль веб-плагина предоставляет команду create-domain-class, поэтому я думаю, что поддержка GORM и Hibernate будет включена по умолчанию, но я, очевидно, неправильно понимаю некоторые аспекты работы плагинов.

...