2017-09-06 2 views
0

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

  1. CompanyCategory - essentiellement deux types de catégorie « Banque » & « Autres »
  2. 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.

Répondre

1

Vous devez lier l'identificateur de banque sélectionné à "banque".id » par l'attribut name, utilisez l'option de touche option et fixer les options de valeur:..

<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> 
+0

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? –

+0

Voici ma balise