Grails 为什么我在save方法中得到这个ValidationException?
我有一个CourseOffering域类,它的属性类型为Term,这是另一个域类 课程服务Grails 为什么我在save方法中得到这个ValidationException?,grails,gorm,Grails,Gorm,我有一个CourseOffering域类,它的属性类型为Term,这是另一个域类 课程服务 class CourseOffering { static fetchMode = [term: 'eager'] String title String key Term term } 术语 我有一个页面来创建一个新的CourseOffering,这是该页面的gsp。编辑:忘了提到我在这里使用的变量“terms”只是Term.list()的传入值 aaannand
class CourseOffering {
static fetchMode = [term: 'eager']
String title
String key
Term term
}
术语
我有一个页面来创建一个新的CourseOffering,这是该页面的gsp。编辑:忘了提到我在这里使用的变量“terms”只是Term.list()的传入值
aaannanddddd这就是我试图保存新创建的CourseOffering时发生的情况
class CourseOffering {
static fetchMode = [term: 'eager']
String title
String key
Term term
}
URI:/office/courseOffering/index
类:grails.validation.ValidationException
消息:在save()期间发生验证错误:-字段“term”上的对象“mcidc.CourseOffering”中的字段错误:拒绝值[mcidc.term:9618];代码[typeMismatch.mcidc.CourseOffering.term,typeMismatch.term,typeMismatch.mcidc.term,typeMismatch];参数[org.springframework.context.support.DefaultMessageSourceResolvable:code[mcidc.CourseOffering.term,term];参数[];默认消息[term];默认消息[未能将类型为“java.lang.String”的属性值转换为属性“Term”所需的类型“mcidc.Term”;嵌套异常为java.lang.IllegalStateException:无法将类型为[java.lang.String]的值转换为属性“Term”所需的类型[mcidc.Term]:未找到匹配的编辑器或转换策略。
grails app\controllers\mcidc\CourseOfferingController.groovy第73行附近
70:newCourse.term=学期
71:assert(newCourse.term-instanceof-term)
72:73:if(newCourse.save(failOnError:true)){ 74:flash.message=[键入:“状态”,文本:“已成功地将${newCourse.title}添加到课程设置列表中。”] 75: } 76:其他{ 这是怎么回事?我用assert语句证明了newCourse.term是term类型的,为什么它说它是字符串?我很困惑
很抱歉stacktrace的格式设置很糟糕,但我确实与此处的格式设置发生了冲突,我不知道如何使其看起来更美观。我试图只发布一张照片,但我没有10%的声誉。newCourse.save(FailOneError:true)上出现了例外情况。这行代码有问题:
CourseOffering newCourse = new CourseOffering(params)
因为您是通过传入参数来创建newCourse的,所以您绑定的是参数“term”,它无法从字符串中转换
将term
参数重命名为termId
,这将推动您前进
普惠制观点:
Term <select name="termId">
<g:each var="term" in="${terms}">
<option value="${term.id}" <g:if test="${term.isCurrent == 'Y'}">selected</g:if>>${term.description}</option>
</g:each>
</select>
谢谢,这就是解决方案。我现在明白了,它试图将params.term映射到newCourse的term属性,我也明白了为什么这样做不起作用。但是我仍然不明白为什么这样做会优先于我之后声明newCourse.term=term。在我试图保存它之前,它似乎应该失败,所以为什么我在我已经声明了术语应该是什么之后,它是否因为映射问题而失败?当您将
params
传递给构造函数时所做的数据绑定会填充实例的错误
。在保存()之前,您可能只需要清除错误()
call.Awesome!我不知道这一点。因此,尽管实例目前没有问题,但在初始绑定时创建的错误仍然存在,这就是它失败的原因。谜团解决了。
CourseOffering newCourse = new CourseOffering(params)
Term <select name="termId">
<g:each var="term" in="${terms}">
<option value="${term.id}" <g:if test="${term.isCurrent == 'Y'}">selected</g:if>>${term.description}</option>
</g:each>
</select>
def save() {
CourseOffering newCourse = new CourseOffering(params)
Term term = Term.get(params.termId)
...
}