Я создаю плагин 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?