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

时间:2014-11-06 19:46:08

标签: grails gorm

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

CourseOffering

class CourseOffering {

    static fetchMode = [term: 'eager']

    String title
    String key 
    Term term
}

期限

class Term {
    String description
    String identifier
    String isCurrent
    Date midterm
}

我有一个页面来创建一个新的CourseOffering,这是该页面的gsp。编辑:忘了提及变量' terms'我在这里使用的只是传入Term.list()

的值
<g:form name="myForm">
    <div class="input">
        Course Title <input type="text" name="title">
        <br><br>
        Course Key  <input type="text" name="key"> 
        <br><br>
        Term <select name="term">
                <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>
        <br><br>
        <g:actionSubmit action="save" value="Create" />
    </div>
</g:form>

这是CourseOfferingController中的save方法

def save() {
    CourseOffering newCourse = new CourseOffering(params)
    Term term = Term.get(params.term)
    newCourse.term = term
    assert(newCourse.term instanceof Term) // I put this here to make sure it was a Term!

    if (newCourse.save(failOnError: true)) {
        flash.message = [type: 'status', text: "Succesfully added ${newCourse.title} to the list of course offerings."]
    }
    else {
        flash.message = [type: 'errors', text:"Unable to add course to the list of course offerings."]
    }

    redirect(action: 'index')
}

Aaaannnddddd当我尝试保存新创建的CourseOffering时会发生这种情况

  

URI:/ office / courseOffering / index   类:grails.validation.ValidationException   消息:验证在save()期间发生错误: - 对象&#39; mcidc.CourseOffering&#39;中的字段错误在字段&#39; term&#39;:被拒绝的值[mcidc.Term:9618];代码[typeMismatch.mcidc.CourseOffering.term,typeMismatch.term,typeMismatch.mcidc.Term,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [mcidc.CourseOffering.term,term];参数[];默认消息[term]];默认消息[无法转换类型&#39; java.lang.String&#39;的属性值要求的类型&#39; mcidc.Term&#39;对于财产&#39; term&#39 ;;嵌套异常是java.lang.IllegalStateException:无法将类型[java.lang.String]的值转换为属性所需的类型[mcidc.Term]&#39;:找不到匹配的编辑器或转换策略

     

grails-app \ controllers \ mcidc \ CourseOfferingController.groovy第73行   70:newCourse.term = term   71:断言(newCourse.term instanceof Term)   72:
  73:if(newCourse.save(failOnError:true)){   74:flash.message = [type:&#39; status&#39;,text:&#34;成功地将$ {newCourse.title}添加到课程列表中。&#34;]   75:}   76:否则{

这里发生了什么?我用我的断言语句证明newCourse.term的类型是Term,那为什么它说它是一个字符串?我很困惑。

很抱歉这个堆栈跟踪的可怕格式化,但我真的在这里与格式化斗争,我无法弄清楚如何使它看起来不错。我试着张贴一张照片,但我没有10点声望。新事件发生在newCourse.save(failOnError:true)

1 个答案:

答案 0 :(得分:3)

问题在于这一行:

CourseOffering newCourse = new CourseOffering(params)

因为您通过传递参数创建了新课程,所以您对该参数的约束具有约束力。它没有办法从字符串转换转换。

term参数重命名为termId,这将推动您前进。

GSP查看:

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