我尝试使用<g:select multiple='true'>
为选择使用多个值,但是当我尝试将表单保存到数据库时,我收到了此错误
Property [Languages] of class [class com.Myapp.hr.EmploymentSeeker] with value [french,english] is not contained within the list [[french, english, russian, chinese]]
这是我的域名:
class EmploymentSeeker {
Set<String> languages = [] as Set
static hasMany = [ languages: String ]
static constraints = {
languages(nullable:true,inList:Holders.config.languages)
}
}
配置文件:
languages=[
'french',
'english',
'russian',
'chinese'
]
GSP:
<g:select multiple="true" name="languages" from="${employmentSeekerInstance.constraints.languages.inList}" value="${employmentSeekerInstance?.languages}" valueMessagePrefix="empSeeker.languages" noSelection="['': '']"/>
可能导致此错误的原因是什么?
答案 0 :(得分:1)
如Grails doc中所述:
inList :约束一个值,使其必须包含在给定列表中。
问题是你的 inList constrant它是一个字符串列表,但languages
中的EmploymentSeeker
不是字符串,它是一个设置即可。
如果它是字符串,它会起作用,例如:
'french'
中包含['french','english','russian','chinese']
但是你有设置,所以
['french']
['french','english','russian','chinese']
要使其与 inList 一起使用,您必须在约束列表中设置用户可以选择的所有组合,例如:
[['french'], ['french', 'english'], ['english', 'french'] ...]
等等。
This回答描述了如何归档这些组合,但实际上它并不是一个好的解决方案,因为subsequences()
并不关心排列。但是,在增加语言列表后,添加排列将以指数方式增加约束列表。
如您所见,在您的情况下,使用 inList 并不是一个好的解决方案。
我建议您实现自定义简单约束,如下所示:
languages(nullable:true,validator: {value, object ->
Holders.config.languages.containsAll(value))
})
的信息