Я обновляю GORM 6.1.9.RELEASE до 6.1.10.RELEASE, чтобы исправить следующее:
https://github.com/grails/grails-data-mapping/issues/1072
Я столкнулся с другой проблемой, когда мой геттер вмой класс домена не вызывается для пустого поля.
Возьмите пример класса домена:
class Factory {
String name
Factory primaryFactory
static constraints = {
primaryFactory nullable: true
}
Factory getPrimaryFactory() {
primaryFactory ?: this
}
}
Теперь возьмите следующий код в Bootstrap.groovy, где создается Factory с установленным primaryFactory.в NULL:
def init = {
def testFactory = new Factory(name: 'Test Factory').save()
assert Factory.count() == 1
}
Когда я создаю следующий TestController, testFactory.primaryFactory.name не отображается в GORM 6.1.10.RELEASE, пока он находится в 6.1.9.RELEASE:
class TestController {
def index() {
Factory testFactory = Factory.findByName('Test Factory')
println "Primary Factory: $testFactory.primaryFactory.name"
render 'Check Console'
}
}
Выводится следующая ошибка:
2018-09-17 12:34:22.161 ERROR --- [nio-8080-exec-1]
o.g.web.errors.GrailsExceptionResolver : NullPointerException
occurred when processing request: [GET] /test/index
Cannot get property 'name' 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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Cannot get property 'name' on null object
at com.mycompany.myapp.TestController.index(TestController.groovy:7)
... 14 common frames omitted
Ниже приведен пример проекта github, для повторного создания просто измените версию GORM в gradle.properties с 6.1.9.RELEASE на 6.1.10.RELEASE:
https://github.com/georgy3k/gorm-6.1.10-NullPointerException
РЕДАКТИРОВАТЬ:
Кажется, я также не могу явно вызвать getter.Когда я пытаюсь сделать это в этом коде:
class TestController {
def index() {
Factory testFactory = Factory.findByName('Test Factory')
String testFactoryPrimaryName = testFactory.getPrimaryFactory().name
println "Primary Factory: $testFactoryPrimaryName"
render 'Check Console'
}
}
Это выдает следующую ошибку:
2018-09-18 11:47:40.837 ERROR --- [nio-8080-exec-4] o.g.web.errors.GrailsExceptionResolver : NullPointerException occurred when processing request: [GET] /test/index
Cannot get property 'name' 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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Cannot get property 'name' on null object
at com.mycompany.myapp.TestController.index(TestController.groovy:9)
... 14 common frames omitted