我正在使用记录贷款的Grails开发一个简单的应用程序。并且有三个简单的域类:
以下是简单的域类:
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指针已修复,但我现在遇到了类型不匹配的错误。任何人都知道如何解决这个问题?
提前致谢。
答案 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}}