2012-04-10 1 views
0

J'ai un formulaire au printemps mvc 2. Ma classe de commande contient une carte complexe que j'ai besoin de lier.Spring JSP Lier une carte

Map<String, Map<String, Class3>> class2Map; 

Dans JSP je peux itérer sur la classe de commande et <c:out> valeurs de carte de Class3 savoir nameToGet & anyElement3. Mais Lorsque je tente de le lier avec la forme

J'utilise

<c:forEach items="${class1.class2List}" var="item" varStatus="itemRow"> 
    <c:forEach var="map" items="${item.class2Map}" varStatus="mapRow"> 
     <c:forEach var="innerMap" items="${map.value}" varStatus="innerMapRow"> 

pour l'itération. Je suis contraignants comme le

<form:input path="class2List[${itemsRow.index}].class2Map[${mapRow.index}].value[0].anyElement3" /> 

il émet une exception comme

org.springframework.beans.NotReadablePropertyException: Invalid property 'class1[0].class2Map[0].value[0].anyElement3' of bean class [Class1]: Bean property 'class1[0].class2Map[0].value[0].anyElement3' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 

Mes classes ressemble

Class1 (Command Class) 
List<Class2> class2List; 
String anyElement1; 

Class2 
Map<String, Map<String, Class3>> class2Map; 
String anyElement2; 

Class3 
Map<String, Class3> class3Map; 
String nameToGet; 
String anyElement3; 

Je lient avec succès les autres membres de données de classe de commande. Comment puis-je lier cette carte à Spring Form?

+0

Veuillez remplir les points; cela peut aider à obtenir de meilleures suggestions. – nobeh

+0

Il contient quelque chose comme ceci :: Invalid propriété 'commandClassName [0] .mapName [0] .value [0] .anyElement3' de la classe bean [commandClassName] –

+0

Pensez-vous que l'idée mentionnée [ici] (http: // blog .vergiss-blackjack.de/2010/04/iterating-sur-imbriqués-objets-dans-un-printemps-forme /) pourrait aider? – nobeh

Répondre

0

Assurez-vous que class1 dispose de getters et setters pour chaque champ.

public Class1{ 
    String nameToGet; 
    String anyElement3; 

    public String getNameToGet(){ 
     return nameToGet; 
    } 

    public void setNameToGet(String nameToGet){ 
     this.nameToGet = nameToGet; 
    } 

    public String getAnyElement3(){ 
     return anyElement3; 
    } 

    public void setAnyElement3(String anyElement3){ 
     this.anyElement3 = anyElement3; 
    } 
} 

Il devrait aussi être getters similaires et setters pour:

Map<String, Map<String, Class1>> mapName; 
+0

J'ai tous les getters et setters. –

0

Dans votre objet de support de forme, créez l'objet (s) que vous souhaitez lier.

public class Class1Form{ 
    private String element3; 
    //Other properties needed in your form. 

    public String getElement3(){ 
      return element3; 
    } 

    public setElement3(String element){ 
      element3 = element; 
    } 
    //Other getters and setters. 
} 
+0

Oui j'ai créé ainsi. Supposons que Class1Form soit votre classe de commande. Il contiendra élément3 en tant que membre de données. Il contiendra également une carte (telle que définie par moi) en tant que membre de données. Comment lier cette carte? –

0

En utilisant l'idée mentionnée here, pouvez-vous essayer ceci:

class1[${itemRow.index}].class2Map['${mapRow.current.key}'].anyElement3 

L'idée est que l'intérieur de la boucle pour mapRow, maintenant il est itérer sur une carte, de sorte que chaque Map.Entry devrait être disponible.

+0

Deux suppositions. (1) Dans la deuxième boucle vous avez 'var =" map "', vous devriez pouvoir utiliser 'class1 [$ {itemRow.index}]. Class2Map ['$ {map.key}']. AnyElement3' (2 Comme les types de clé sont tous 'String', je crois qu'il manquait un' '' autour de la clé. – nobeh

+0

J'ai la même exception. –

Questions connexes