Bonjour,
je viens vers vous car j'ai un problème avec le selectOneMenu de PrimeFaces. Je n'arrive pas à le faire fonctionner correctement et avec ce que je lis sur le net je suis pomé. J'ai tellement testé de trucs que je ne sais pas si ce que j'ai fini par mettre dans mes fichiers m'aide ou non.
Mon problème : Je ne parviens pas à mettre une valeur par défaut dans ma liste (c'est toujours la 1ere valeur qui est présélectionnée). Et je ne parviens pas à récupérer la valeur sélectionné par l'utilisateur, elle reste toujours inchangée : en fait le setter n'est jamais appelé.
La fameuse liste :
Ma pageInstanceBean :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <h:outputLabel for="envselect" value="Environnement :" /> <h:selectOneMenu id="envselect" value="#{pageInstanceBean.envSelected}" converter="#{environnementConverter}"> <f:selectItems value="#{pageInstanceBean.envAvailable}" /> <f:ajax execute="envselect" render="inputEnvNom" /> </h:selectOneMenu> <p:message for="envselect" /> <h:outputText id="inputEnvNom" value="#{pageInstanceBean.envSelected.nomEnv}" />
Sur le net un coup il faut pour l'item sélectionné le mettre en String, un autre il faut l'id, et un autre moment c'est sous forme d'Objet... Finalement pour la suite je me suis dis que le mieu est de l'avoir sous forme d'objet. Et de même pour la liste des item disponible j'ai vu une liste<Objet> ou une liste<SelectItem>.
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 @ManagedBean @ViewScoped public class PageInstanceBean implements Serializable { private Environnement envSelected; private List<SelectItem> envAvailable; @EJB private EnvironnementDao _environnementDao; //getter setter public Environnement getEnvSelected() { System.out.println("GET env = "+envSelected+" nom = "+envSelected.getNomEnv()); return envSelected; } public void setEnvSelected(Environnement envSelected) { this.envSelected = envSelected; System.out.println("SET env = "+this.envSelected.getNomEnv()); } }
Franchement avec tous ces choix, j'ai un peu tout testé et finalement rien compris. Donc si quelqu'un pourrais m'expliquer tout sa pour que je puisse faire le bon choix...
Avec tout sa aparement j'avais besoin d'un converter :
Et pour pouvoir utiliser des ejb dans un converter j'avais besoin dans mon fichier faces-config de sa :
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 @FacesConverter(forClass = Environnement.class) public class EnvironnementConverter implements Converter { @EJB private EnvironnementDao _environnementDao; @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { if (value.trim().equals("") || value.trim().length() == 0) { return null; } if (_environnementDao != null) { Environnement env = new Environnement(); env =_environnementDao.trouver(value); return env; } else { return null; } } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (value == null) { return null; } if (value instanceof Environnement) { Environnement env = (Environnement) value; return env.getNomEnv(); } else { return null; } } }
Et j'avais besoin d'ajouter dans ma classe Environnement ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <managed-bean> <managed-bean-name>environnementConverter</managed-bean-name> <managed-bean-class>com.converter.EnvironnementConverter</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
Avec tout sa maintenant quand je tente d'afficher directement envSelected j'obtient son nomEnv. Ce que je voulais. Comme j'ai cru comprendre que pour préselectionner une valeur PrimeFaces comparait le itemSelect avec la listItems et s'il y avait une correspondance c'était bon. Mais finalement il compare quoi ?
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 @Entity @Table(name="Environnement") public class Environnement { @Id @GeneratedValue( strategy = GenerationType.IDENTITY ) @Column( name = "idEnv" ) private int idEnv; @Column( name = "nomEnv" ) private String nomEnv; @OneToMany(mappedBy="idEnv") private List<Instance> instanceList; //getter setter public boolean equals(Environnement e) { boolean result = true; if (this.nomEnv != e.nomEnv) { result = false; } return result; } @Override public int hashCode() { int hash = 1; hash = hash * 17 + idEnv; return hash; } @Override public String toString() { return this.nomEnv; } }
Néanmoins ma liste se remplis correctement, la conversion fonctionne (dans mes log je le vois), mais le reste...
Le seul endroit où je vois que la valeur sélectionnée est bien la bonne c'est dans la méthode getAsObject de mon converter car le String value prend bien la valeur que je viens de sélectionner... Le converter envois l'object généré à qui apres ?
Si quelqu'un à une idée, une explication ? Merci
Partager