Grails 为什么我在save方法中得到这个ValidationException?

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

我有一个CourseOffering域类,它的属性类型为Term,这是另一个域类

课程服务

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)
    ...
}