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 :
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}" />
Ma pageInstanceBean :
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());
     }
}
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>.
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 :
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 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
 
<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>
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
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;
    }
}
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 ?
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