Bonjour,

Je développe depuis peu une nouvelle application avec JSF 1.2 et richFaces 3.3.0GA.

En suivant la 3ème méthode de la FAQ, j'arrive bien à MAJ chacune de mes lignes en utilisant un setPropertyActionListener.
Par contre, je me trouve devant une impasse lorsque j'utilise un selectOneMenu dans une de mes colonnes.
En effet, seule la dernière ligne de ma table prends en compte la nouvelle valeur alors que les autres gardent l'ancienne lors de la MAJ.

Existe-t-il une bonne pratique que je n'ai pas mise en œuvre ?
Es-ce un problème connu ? Quels solutions adopter ?

Ma page xhtml:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<rich:dataTable id="tableMessage" cellpadding="0" cellspacing="0" 
                    width="700" border="0" var="mess" value="#{messageBean.messages}"
                    rowClasses="fondBlanc,fondCouleur">
 
	    			<f:facet name="header">
                        <rich:columnGroup styleClass="fondCouleur">
                            <rich:column breakBefore="true"><h:outputText value="Message" /></rich:column>
                            <rich:column width="1%"><h:outputText value="Cible" /></rich:column>
                            <rich:column width="1%"><rich:spacer width="17" height="10"/></rich:column>
                        </rich:columnGroup>
                    </f:facet>
 
	    			<rich:column colspan="1">
	    				<h:inputText styleClass="sansBord" value="#{mess.corpsMessage}"/>
	    			</rich:column>
 
	    			<rich:column colspan="1">
	    				<h:selectOneMenu id="selectTypeId" styleClass="sansBord" value="#{mess.typeUtilisateur.idTypeUtilisateur}" >
	    					<f:selectItems value="#{messageBean.tousLesTypesUtilisateurs}"/>
	    				</h:selectOneMenu>
	    			</rich:column>
 
	    			<rich:column colspan="1">
	    				<h:commandLink action="#{messageBean.processSauvMessage}" >
	    					<h:graphicImage value="../images/valider.jpg" width="17" height="17" title="Valider les modifications" />
	    						<f:setPropertyActionListener value="#{mess}" target="#{messageBean.messToSave}" />
	    				</h:commandLink>
	    			</rich:column>
 
	    		</rich:dataTable>
Mon BackingBean:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class MessageBBean {
 
	private List<Message> messages;
	private List<SelectItem> tousLesTypesUtilisateurs;
	private Message messToSave;
 
	public MessageBBean() {
	}
 
	public List<Message> getMessages() {
		return messages;
	}
 
	public void setMessages(List<Message> messages) {
		this.messages = messages;
	}
 
	public List<SelectItem> getTousLesTypesUtilisateurs() {
		return tousLesTypesUtilisateurs;
	}
 
	public void setTousLesTypesUtilisateurs(
			List<SelectItem> tousLesTypesUtilisateurs) {
		this.tousLesTypesUtilisateurs = tousLesTypesUtilisateurs;
	}
 
	public Message getMessToSave() {
		return messToSave;
	}
 
	public void setMessToSave(Message messToSave) {
		this.messToSave = messToSave;
	}
 
	public String initMessages(){
		try {
			List<TypeUtilisateur> l = MessageDelegate.getAllTypeUtilisateurs();
			this.tousLesTypesUtilisateurs = new ArrayList<SelectItem>();
			for(TypeUtilisateur t : l){
				this.tousLesTypesUtilisateurs.add(new SelectItem(t.getIdTypeUtilisateur(),t.getLibelleTypeUtilisateur()));
			}
			this.messages = MessageDelegate.getAllMessages();
		} catch (Exception e) {
			e.printStackTrace();
			return "retourAccueil";
		}
		return "h1MessageGestion";
	}
 
	public void processSauvMessage(){
 
		this.messToSave = MessageDelegate.updateMessage(this.messToSave);		
		String rien = initMessages();
		FacesContext.getCurrentInstance().renderResponse();
	}