我有一个表(Oracle 12c DB),该表在Grails(3.3.9)中不包含显式ID列,我想动态地对其进行支撑。因此,我试图创建一个由其所有列组成的复合键(它们都不为空),因为这是我唯一能找到的解决方法,因此代码如下所示:
class AliasFrequencyDict implements Serializable{
String frequency
String unit
String description
String lang
static constraints = {
frequency maxSize: 10, sqlType: 'VARCHAR2'
unit maxSize: 1, sqlType: 'VARCHAR2'
description maxSize: 30, sqlType: 'VARCHAR2'
lang maxSize: 2, sqlType: 'VARCHAR2'
}
static mapping = {
sort 'frequency'
version false
id composite: ['frequency', 'unit', 'description', 'lang']
}
}
在控制器中,我仅拥有static scaffold = AliasFrequencyDict
。但是,当我尝试访问索引时,我得到一个java.lang.NullPointerException
并显示一条消息,内容为Request processing failed; nested exception is org.grails.gsp.GroovyPagesException: Error processing GroovyPageView: [Byte array resource [view:-,-,aliasFrequencyDict:index]:21] Error executing tag <f:table>: null
。 stacktrace看起来像这样:
Line | Method
->> 473 | createGroovyPageException in Byte array resource [view:-,-,aliasFrequencyDict:index]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Caused by GrailsTagException: [Byte array resource [view:-,-,aliasFrequencyDict:index]:21] Error executing tag <f:table>: null
->> 21 | throwRootCause in Byte array resource [view:-,-,aliasFrequencyDict:index]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Caused by NullPointerException: null
->> 35 | <init> in org.grails.scaffolding.model.property.DomainPropertyImpl
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 26 | build in org.grails.scaffolding.model.property.DomainPropertyFactoryImpl
| 118 | getListOutputProperties . . in org.grails.scaffolding.model.DomainModelServiceImpl
| 540 | resolvePersistentProperties in grails.plugin.formfields.FormFieldsTagLib
| 415 | resolvePropertyNames . . . . in ''
| 402 | resolveProperties in ''
| 230 | doCall . . . . . . . . . . . in grails.plugin.formfields.FormFieldsTagLib$_closure4
| 446 | invokeTagLibClosure in org.grails.gsp.GroovyPage
| 364 | invokeTag . . . . . . . . . in ''
| 54 | doCall in Byte_array_resource__view_____aliasFrequencyDict_index_$_run_closure2
| 200 | executeClosure . . . . . . . in org.grails.taglib.TagBodyClosure
| 102 | captureClosureOutput in ''
| 213 | call . . . . . . . . . . . . in ''
| 48 | captureTagContent in org.grails.plugins.web.taglib.SitemeshTagLib
| 156 | doCall . . . . . . . . . . . in org.grails.plugins.web.taglib.SitemeshTagLib$_closure3
| 446 | invokeTagLibClosure in org.grails.gsp.GroovyPage
| 364 | invokeTag . . . . . . . . . in ''
| 72 | run in Byte_array_resource__view_____aliasFrequencyDict_index_
| 162 | doWriteTo . . . . . . . . . in org.grails.gsp.GroovyPageWritable
| 82 | writeTo in ''
| 76 | renderTemplate . . . . . . . in org.grails.web.servlet.view.GroovyPageView
| 71 | renderWithinGrailsWebRequest in org.grails.web.servlet.view.AbstractGrailsView
| 55 | renderMergedOutputModel . . in ''
| 303 | render in org.springframework.web.servlet.view.AbstractView
| 150 | renderInnerView . . . . . . in org.grails.web.sitemesh.GrailsLayoutView
| 128 | obtainContent in ''
| 63 | renderTemplate . . . . . . . in ''
| 71 | renderWithinGrailsWebRequest in org.grails.web.servlet.view.AbstractGrailsView
| 55 | renderMergedOutputModel . . in ''
| 303 | render in org.springframework.web.servlet.view.AbstractView
| 1286 | render . . . . . . . . . . . in org.springframework.web.servlet.DispatcherServlet
| 1041 | processDispatchResult in ''
| 984 | doDispatch . . . . . . . . . in ''
| 901 | doService in ''
| 970 | processRequest . . . . . . . in org.springframework.web.servlet.FrameworkServlet
| 861 | doGet in ''
| 846 | service . . . . . . . . . . in ''
| 55 | doFilterInternal in org.springframework.boot.web.filter.ApplicationContextHeaderFilter
| 77 | doFilterInternal . . . . . . in org.grails.web.servlet.mvc.GrailsWebRequestFilter
| 67 | doFilterInternal in org.grails.web.filters.HiddenHttpMethodFilter
| 1149 | runWorker . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor
| 624 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 748 | run . . . . . . . . . . . . in java.lang.Thread
为什么会这样?如何解决此问题,以便脚手架再次开始工作?