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

时间:2017-09-06 11:06:25

标签: forms select grails field

我正在使用记录贷款的Grails开发一个简单的应用程序。并且有三个简单的域类:

  1. CompanyCategory - 基本上有两种类型,“银行”和“其他”
  2. 公司 - 系统中的所有公司。
  3. 贷款 - 记录我们从哪家银行借款,以及贷款金额。
  4. 以下是简单的域类:

    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 test.Loan]的属性[bank]不能为null

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

    提前致谢。

    编辑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指针已修复,但我现在遇到了类型不匹配的错误。任何人都知道如何解决这个问题?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

更改

<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"/>

希望有所帮助。

答案 1 :(得分:1)

您需要绑定所选的&#34;银行ID&#34; to&#34; bank.id&#34;通过name属性,使用optionKey选项并修复值选项:

{{1}}