我有一个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)
答案 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)
...
}