Grails GORM & Enums
I've a problem using Enumeration in Grails: I try to use an enumeraion in a grails domain object
code:
package it.xxx.tools.kanban
import java.util.Date;
class Task {
String name
String description
Priority priority
static belongsTo = [user:User, project:Project]
static constraints = {
name(nullable:false, maxSize:25)
description(nullable:false, maxSize:1500)
priority(nullable:true)
}
}
package it.xxx.tools.kanban;
public enum Priority {
VERY_LOW("Very Low"),
LOW("Low"),
MEDIUM("Medium"),
HIGH("High"),
VERY_HIGH("Very High")
private final String value
Priority(String value){
this.value = value;
}
String toString() {
value
}
String getKey() {
name()
}
static list(){
[VERY_LOW, LOW, MEDIUM, HIGH, VERY_HIGH]
}
}
<tr class="prop">
<td valign="top" class="name">
<label for="priority">Priority:</label>
</td>
<td valign="top" class="value ${hasErrors(bean:taskInstance,field:'priority','errors')}">
<g:select from="${it.weservice.tools.kanban.Priority?.values()}" value="${taskInstance?.prior开发者_如何学Goity}" name="priority" noSelection="['':'']"></g:select>
</td>
</tr>
I use the grails generate-all command
When I try to save via the web application the Task object I have the following error:
Failed to convert property value of type [java.lang.String] to required type [it.weservice.tools.kanban.Priority] for property priority; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [it.weservice.tools.kanban.Priority] for property priority: no matching editors or conversion strategy found
I answer my own question because other user can find it usefull: i checked the grails tips regarding enums here (bottom of the page) In my implementation I forgot the optionKey="key" in the g:select tag
Adding that all woked smoothly
You need to change the view, for example add optionValue="value"
on the select in the create.gsp.
You don't need:
String toString() {
value
}
String getKey() {
name()
}
Yo need to have a getValue()
, so change private final String value
to final String value
.
More info (in spanish): http://thewhitehatsolution.wordpress.com/
If you're using scaffold = true
in your controller, then you can also modify the template that generates the select tags in the views by editing the renderEditor.template
file. To do this :
grails install-templates
- Edit the file
src/templates/scaffolding/renderEditor.template
- Edit the method
renderEnumEditor(...)
and add inoptionKey=\"key\"
to the select tag's options.
精彩评论