我使用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域对象本身的 Controller 中:
Class
org.hibernate.TransientObjectException
Message
object references an unsaved transient instance - save the
transient instance before flushing

我不明白为什么Varn域对象(父对象)试图保留已经通过formRemote创建的VarnType(子对象)。我应该采取其他步骤使该对象可用于Grails吗?

编辑:这是 Controller 代码:
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']
    }

    }

谢谢。

最佳答案

我希望您有一个名为varnType的请求参数,并且正在执行类似new Varn(params)的操作。当数据绑定(bind)程序尝试在varnType实例中初始化Varn属性时,由于您没有告诉过它,否则我们尝试调用new VarnType(params.varnType),但失败。

如果希望活页夹能够从字符串创建VarnType实例,则需要执行类似的操作,例如提供自定义Converter或使用BindUsing批注。用户指南中涵盖了所有这些内容。参见http://grails.org/doc/latest/guide/theWebLayer.html#dataBinding

09-18 01:16