I have a table (Oracle 12c DB) which does not include an explicit ID column in Grails (3.3.9) and I'd like to scaffold it dynamically. Thus, I tried to create a composite key consisting of all its columns (none of them nullable), as that's the only workaround that I've been able to find, so that the code looks like this:
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']
}
}
In the controller, I simply have static scaffold = AliasFrequencyDict
. When I try to access the index, though, I get a java.lang.NullPointerException
with a message reading 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
. The stacktrace looks like this:
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
Why is that so? How can I fix this so that the scaffolding starts working again?