2010-12-12 100 views
0

J'ai du mal à utiliser la conversion de type dans Struts 2 pour convertir la collection de haricots. J'ai suivant la classe d'action:Problème de conversion du type de collection Struts 2

@Validation() 
@Conversion() 
public class HelloWorldAction extends ActionSupport { 


    private List<HelloBean> helloBeans = new ArrayList<HelloBean>(); 


    public String execute() throws Exception { 
     System.out.println(helloBeans); 
     return SUCCESS; 
    } 
    public List<HelloBean> getHelloBeans() { 
     return helloBeans; 
    } 

    @TypeConversion(rule = ConversionRule.COLLECTION, converter = "foo.HelloBean") 
    public void setHelloBeans(List<HelloBean> helloBeans) { 
     this.helloBeans = helloBeans; 
    } 

} 

et ma classe de haricots:

public class HelloBean { 
    private String name; 
    private Integer age; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Integer getAge() { 
     return age; 
    } 
    public void setAge(Integer age) { 
     this.age = age; 
    } 

} 

et mon fichier JSP:

<s:form action="helloWorld"> 

    <s:textfield name="helloBeans.name" label="name1"/> 
    <s:textfield name="helloBeans.name" label="name2" /> 
    <s:textfield name="helloBeans.age" label="age1"/> 
    <s:textfield name="helloBeans.age" label="age2"/> 
     <s:submit /> 
    </s:form> 

Lorsque le processus a été soumis, Struts me donnent toujours 4 objet, au lieu de 2 objet à l'intérieur de la collection. Je sais qu'une autre solution de contournement utilisant l'index dans la propriété résoudra le problème, mais pour mon cas j'ai besoin que la collection soit dynamique. Est-il possible de résoudre ce genre de problème?

J'ai essayé d'autres annotations ainsi:

@Element(value =foo.HelloBean.class) 
    @CreateIfNull(value = true) 
    @KeyProperty(value = "name") 
    private List<HelloBean> helloBeans = new ArrayList<HelloBean>(); 

mais aucun d'entre eux a travaillé

+0

FYI: Vous n'avez pas besoin d'initialiser helloBeans dans votre action. Votre setter fera cela. –

Répondre

0

vous devez utiliser autant que je sache:

<s:form action="hello-world"> 
     <s:textfield name="helloBeans[1].name" label="name1"/> 
     <s:textfield name="helloBeans[1].age" label="age1"/> 
     <s:textfield name="helloBeans[2].name" label="name2" /> 
     <s:textfield name="helloBeans[2].age" label="age2"/> 
     <s:submit /> 
    </s:form> 

Je pense que le plus gros problème est qu'il ne doit être fait de cette façon mais que vous pensez que cela signifie qu'il ne peut pas être dynamique, considérez que les champs de texte sont rendus plus-moins (en fait moins parce que j'ai enlevé les attributs 'id' et 'value'):

<input type="text" name="helloBeans[1].name"/> 
<input type="text" name="helloBeans[1].age"/> 
... 

Il n'y a aucune raison que vous ne pouvez pas non plus gérer cela dans votre jsp dynamiquement fait pour tester la vue:

<h1>Display HelloBeans</h1> 
    <table> 
     <s:iterator value="helloBeans"> 
      <tr> 
       <td><s:property value="name"/></td> 
       <td><s:property value="age"/></td> 
      </tr> 
     </s:iterator> 
    </table> 

Ou si votre problème est côté client puis utilisez JavaScript (ou mieux une Bibliothèque JS telle que jQuery) pour ajouter de nouveaux champs de texte au DOM ... et utiliser la concaténation de chaîne pour construire le bon OGNL pour les attributs 'name'.

Remarque si votre comportement dynamique est côté serveur dans le JSP, puis

<s:property value="#helloBeans.index" /> 

vous obtiendrez l'indice de l'itération courante lorsqu'elle est utilisée dans les s: tag iterator.