Je suis en train de développer une application simple qui utilise des grails pour enregistrer des prêts. Et il y a trois classes simples de domaine:Erreur de correspondance de type avec g: select avec un objet de domaine
- CompanyCategory - essentiellement deux types de catégorie « Banque » & « Autres »
- Company - toutes les entreprises qui sont dans le système. Prêt: les enregistrements dont nous empruntons la banque, et combien.
Voici les classes simples de domaine:
class CompanyCategory {
String categoryName
}
class Company {
String companyName
CompanyCategory category
}
class Loan {
Company bank
BigDecimal loanAmount
}
De mon contrôleur, j'ai trouvé toutes les entreprises qui sont de type banque, et le transmettre à mon gsp, en tant que tel:
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]
}
Dans mon GSP, voici comment il ressemble:
<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>
Jusqu'ici, nous pouvons voir dans la liste déroulante que seules les banques sont affichées dans la liste déroulante, et le reste des entreprises ne le sont pas.
Cependant, lorsque je tente de soumettre le formulaire, je reçois l'erreur suivante:
propriété [banque] de classe [classe test.Loan] ne peut être nulle
Qu'est-ce que je fait de mal? Ou y a-t-il une meilleure façon de faire cela?
Merci d'avance.
EDIT 1
C'est la méthode d'enregistrement
@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] }
}
}
EDIT 2 Après avoir modifié le code:
<f:field bean="loan" property="bank" >
<g:select name="bank" from="${banks}" value="{banks?.id}" />
</f:field>
Le pointeur NULL a été corrigé, mais J'ai maintenant une erreur de type incompatibles. Quelqu'un sait comment résoudre ce problème?
Merci d'avance.
Merci pour aider. l'erreur devient: La propriété [category] de la classe [class test.Company] ne peut pas être nulle La propriété [companyName] de la classe [class test.Company] ne peut pas être nulle Qu'est-ce qui aurait pu ne pas fonctionner? –
Voici ma balise
Merci beaucoup! Cela a totalement fonctionné! J'ai fait quelques petits changements dans ma version finale et ça a fonctionné à merveille. Encore une fois merci beaucoup @bassmartin! –