2014-09-01 1 views
1

J'essaie d'utiliser la liaison de données grails pour mapper certains paramètres de formulaire dans mon modèle, mais je pense qu'il y a peut-être quelques limitations concernant le mappage des collections incorporées.Limitation de GrailsDataBinder?

Par exemple, si je vous soumets quelques paramètres comme celui-ci alors l'application fonctionne très bien:

//this works 
productLineItems[0].product.id='123' 
productLineItems[0].name='product name' 
productLineItems[0].description='some description' 
... 

Cependant, si ma collection productLineItems est intégré au sein d'une association de la classe de domaine que j'essaie de sauver puis GrailsDataBinder coups avec un org.codehaus.groovy.grails.exceptions.InvalidPropertyException:

//this blows up 
sale.productLineItems[0].product.id='123' 
sale.productLineItems[0].name='product name' 
sale.productLineItems[0].description='some description' 
... 

Je voudrais vraiment éviter d'avoir à faire la mise en correspondance à la main. Y a-t-il un moyen de contourner ceci? J'utilise Grails 2.3.7.

+0

Il n'y a pas assez d'informations ici pour dire avec certitude ce qui ne va pas. J'ai fourni une réponse ci-dessous qui inclut un lien vers un projet qui utilise la même structure param imbriquée que vous décrivez et la liaison semble y fonctionner. S'il y a des détails que vous pouvez changer à propos de cette application qui va déclencher le problème, n'hésitez pas à envoyer une demande de tirage ou à décrire le changement ici et je peux jeter un oeil. –

+0

Merci Jeff - J'essaie juste ton projet maintenant. Je vais voir si ça frappe la ligne de code qui me souffle dans 'GrailsDataBinder' – rcgeorge23

+0

J'avais oublié que vous utilisiez' GrailsDataBinder'. C'est le vieux liant à base de printemps. Y a-t-il une raison pour laquelle vous utilisez le classeur Spring au lieu du nouveau classeur Grails? Cela peut être la différence significative entre votre application et la démo ci-dessous. Le classeur de printemps n'est plus maintenu ou pris en charge. Il a été laissé dans Grails 2.3.x pour la rétrocompatibilité. –

Répondre

1

Voir l'exemple d'application au https://github.com/jeffbrown/embeddedcollectionbinding. C'est une application Grails 2.3.7 qui montre une façon de gérer les collections imbriquées de liaison. Le test suivant utilise la même structure de paramètres imbriqués que vous avez décrit, et le test passe:

// test/unit/demo/DemoControllerSpec.groovy 
package demo 

import grails.test.mixin.TestFor 
import spock.lang.Specification 

@TestFor(DemoController) 
@Mock([Entry, Sale, ProductLineItem, Product]) 
class DemoControllerSpec extends Specification { 

    void "test something"() { 
     given: 
     def product = new Product(code: 'initial product code').save() 

     when: 
     params.'sale.description' = 'some sale' 
     params.'sale.productLineItems[0].product.id' = product.id 
     params.'sale.productLineItems[0].name' = 'updated product name' 
     params.'sale.productLineItems[0].description' = 'updated product description' 
     def model = controller.createEntry() 
     def entry = model.entry 

     then: 
     entry 
     entry.sale 
     entry.sale.description == 'some sale' 
     entry.sale.productLineItems[0] instanceof ProductLineItem 
     entry.sale.productLineItems[0].name == 'updated product name' 
     entry.sale.productLineItems[0].description == 'updated product description' 
     entry.sale.productLineItems[0].product 
     entry.sale.productLineItems[0].product.code == 'initial product code' 
    } 
} 

S'il y a un autre détail dans votre modèle qui complique cela, si vous pouvez fournir plus de détails, je serai heureux de aider si je peux.

J'espère que cela aide.

+0

Comme décrit dans les commentaires ci-dessous la question initiale, ce scénario fonctionne et est pris en charge avec le nouveau classeur de données qui a été introduit avec Grails 2.3 et ne fonctionne pas avec le classeur hérité obsolète. Le classeur hérité n'est plus maintenu et je ne prévois pas que nous examinerions cela et que nous le corrigerions à ce stade. La voie à suivre est d'utiliser le nouveau classeur de données comme indiqué dans l'application de démonstration ci-dessus. –