对域对象使用 g:select 类型不匹配错误
Type Mismatch Error using g:select with a domain object
我正在使用 grails 开发一个简单的应用程序来记录贷款。并且有3个简单域classes:
- CompanyCategory - 基本上是两种类别,"Bank" & "Others"
- 公司 - 系统中的所有公司。
- 贷款 - 记录我们从哪家银行借款,以及借款金额。
以下是简单域名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>
我正在使用 grails 开发一个简单的应用程序来记录贷款。并且有3个简单域classes:
- CompanyCategory - 基本上是两种类别,"Bank" & "Others"
- 公司 - 系统中的所有公司。
- 贷款 - 记录我们从哪家银行借款,以及借款金额。
以下是简单域名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>