对域对象使用 g:select 类型不匹配错误

Type Mismatch Error using g:select with a domain object

我正在使用 grails 开发一个简单的应用程序来记录贷款。并且有3个简单域classes:

  1. CompanyCategory - 基本上是两种类别,"Bank" & "Others"
  2. 公司 - 系统中的所有公司。
  3. 贷款 - 记录我们从哪家银行借款,以及借款金额。

以下是简单域名classes:

class CompanyCategory {

    String  categoryName

}

class Company {

    String              companyName
    CompanyCategory     category

}

class Loan {

    Company     bank
    BigDecimal  loanAmount

}

从我的控制器中,我找到了所有银行类型的公司,并将其传递给我的 gsp,如下所示:

def create() {

    // Looking for all the companies that are of Bank category
    def banks = Company.findAllByCategory( CompanyCategory.findAllByCategoryName("Bank") )

    respond new Loan(params), model:[banks: banks]
}

在我的 GSP 中,它是这样的:

        <g:form resource="${this.loan}" method="POST">


            <fieldset class="form">

                <f:field bean="loan" property="bank" >
                    <g:select name="lender" from="${banks}" value="{banks?.id}" />
                </f:field>

                <f:field bean="loan" property="loanAmount" />

            </fieldset>


            <fieldset class="buttons">
                <g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" />
            </fieldset>
        </g:form>

到这里,我们从下拉列表中可以看出,只有银行出现在下拉列表中,其余的公司都没有。

但是,当我尝试提交表单时,出现以下错误:

属性 class [class test.Loan] 的 [银行] 不能为空

我做错了什么?或者有更好的方法吗?

提前致谢。

编辑 1

这是保存方法

@Transactional
def save(Loan loan) {
    if (loan == null) {
        transactionStatus.setRollbackOnly()
        notFound()
        return
    }

    if (loan.hasErrors()) {
        transactionStatus.setRollbackOnly()
        respond loan.errors, view:'create'
        return
    }

    loan.save flush:true

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.created.message', args: [message(code: 'loan.label', default: 'Loan'), loan.id])
            redirect loan
        }
        '*' { respond loan, [status: CREATED] }
    }
}

编辑 2 将代码更改为:

                <f:field bean="loan" property="bank" >
                    <g:select name="bank" from="${banks}" value="{banks?.id}" />
                </f:field>

NULL 指针已修复,但我现在收到类型不匹配错误。有人知道我该如何解决这个问题吗?

提前致谢。

改变

<f:field bean="loan" property="bank" >
    <g:select name="lender" from="${banks}" value="{banks?.id}" />
</f:field>

至此

<f:field bean="loan" property="bank" >
    <g:select name="bank" from="${banks}" optionValue="companyName" optionKey="id" noSelection="['': '']" />
</f:field>

当您提交表单时,Grails 使用 "name" 属性 将数据绑定到域对象。

修复类型不匹配错误

<f:field bean="loan" property="loanAmount" name="loanAmount"/>

希望对您有所帮助。

您需要通过 name 属性将选择的 "bank id" 绑定到 "bank.id",使用 optionKey 选项并固定值 options :

<f:field bean="loan" property="bank" >
    <g:select class="form-control" id="bank" name="bank.id" from="${banks}" optionKey="id" optionValue="companyName" value="${loan.bank.id}"/>
</f:field>