我使用grails formRemote标签将项目添加到下拉列表"动态"。该项目确实已添加,但当我提交主表单时,我得到:
Could not find matching constructor for: VarnType(java.lang.String)
其中Varn是在主窗体中创建的域对象,VarnType是下拉列表中列出的域对象,我使用formRemote添加的列表。 这是formRemote用法:
<g:form url="[resource:varnInstance, action:'save']" id="mainV">
<fieldset class="form">
<g:render template="form"/>
</fieldset>
<fieldset class="buttons">
<g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
</fieldset>
</g:form>
<g:formRemote name="vTypeForm"
url="[controller:'varnType', action:'createVarnTypeOnTheFly']"
update="varnType">
<input type="text" name="typeName" >
<input type="submit" value="Create Varn Type!">
</g:formRemote>
认为VarnType对象需要另一个带有String参数的构造函数,我在Varn域对象本身的控制器中添加了它,但得到了它:
Class
org.hibernate.TransientObjectException
Message
object references an unsaved transient instance - save the
transient instance before flushing
我不明白为什么Varn域对象(父对象)试图保留已经通过formRemote创建的VarnType(子对象)。我是否应该采取额外步骤使Grails可以使用此对象?
编辑:这是控制器代码:
def createVarnTypeOnTheFly(){
VarnType vt = new VarnType(params)
vt.save flush: true
render(template: '/config/varnTypeOptions',model:[optionList: VarnType.list()])
}
这是实体关系:
class VarnType {
String typeName
static constraints = {
}
static mapping = {
id column:"varn_type_id"
id generator: "sequence",params: [sequence:"scan_sequence"]
}
String toString(){
return typeName
}
}
VarnType:
class Varn {
Application app
Assessment assessment
String varnName
String recommendation
String httpMethod
VarnType varnType
String varnNote
String param
Risk risk
String urlParam
Date dateFound
Date dateReported
Date dateFixed
static hasMany = [varnNotes:AppNote]
static constraints = {
varnName nullable: true
urlParam nullable: true
risk nullable: true
recommendation nullable: true
assessment nullable: true
}
static mapping = {
id column:'varn_id'
id generator: 'sequence',params:[sequence:'scan_sequence']
}
}
感谢。
答案 0 :(得分:3)
我希望你有一个名为varnType
的请求参数,你正在做new Varn(params)
之类的事情。当数据绑定器尝试初始化varnType
实例中的Varn
属性时,由于您没有告诉它,否则我们会尝试调用失败的new VarnType(params.varnType)
。
如果您希望绑定器能够从String创建VarnType
的实例,则需要执行类似提供自定义Converter
或使用BindUsing
注释的操作。所有这些都包含在用户指南中。请参阅http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding。