Grails:当 运行 插件时,服务未注入控制器
Grails: service not being injected in controller when running plugin
我正在创建一个 Grails (3.3.9) 插件来保存一些内部应用程序的共享后端代码。出于某种原因,当我 运行 测试插件时,我的服务没有被注入到我的控制器中。
我从默认的网络插件配置文件开始,创建了一个名为 Entry 的域 class,然后 运行 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
堆栈跟踪将我带到控制器中的第 18 行:
def show(Long id) {
respond entryService.get(id)
}
这向我暗示 entryService
为空。
我的域 class 如下所示:
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
端点并从我的数据库中取回结果。
有一次我尝试将服务实现为 class 而不是将其作为接口,但随后我收到此错误:
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 插件,我错过了什么?
通过深入研究 GORM 问题终于找到了答案:
显然问题的根源是需要将 compile "org.grails.plugins:hibernate5"
添加到我在 build.gradle
中的 dependencies
块。奇怪的是 web-plugin 配置文件提供了 create-domain-class
命令,所以我认为默认情况下会包含 GORM 和 Hibernate 支持,但我显然误解了插件应该如何工作的某些方面.
我正在创建一个 Grails (3.3.9) 插件来保存一些内部应用程序的共享后端代码。出于某种原因,当我 运行 测试插件时,我的服务没有被注入到我的控制器中。
我从默认的网络插件配置文件开始,创建了一个名为 Entry 的域 class,然后 运行 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
堆栈跟踪将我带到控制器中的第 18 行:
def show(Long id) {
respond entryService.get(id)
}
这向我暗示 entryService
为空。
我的域 class 如下所示:
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
端点并从我的数据库中取回结果。
有一次我尝试将服务实现为 class 而不是将其作为接口,但随后我收到此错误:
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 插件,我错过了什么?
通过深入研究 GORM 问题终于找到了答案:
显然问题的根源是需要将 compile "org.grails.plugins:hibernate5"
添加到我在 build.gradle
中的 dependencies
块。奇怪的是 web-plugin 配置文件提供了 create-domain-class
命令,所以我认为默认情况下会包含 GORM 和 Hibernate 支持,但我显然误解了插件应该如何工作的某些方面.