Grails中的Ajax调用导致“找不到匹配的构造函数”

时间:2014-07-14 17:30:17

标签: ajax grails

我使用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']
    }

    }

感谢。

1 个答案:

答案 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