Bonjour à tous.
je voudrais savoir comment créer une liste déroulante qui fait référence à une entité(qui contient des instances d'une entités) en JSF avec le tag selectOneMenu.
Si vous avez des liens ou des tutos ou même des bouts de code qui traitent mon cas ça serait salvateur de me les fournir puisque ça fait plus d'une semaine que je suis bloqué et je ne pouvais pas continuer car dans presque 90% de mon application je vais en avoir besoin.

Voilà ce que j'ai tenté sans succès :

Le code de la collection qui contient les données de la liste :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
/*Comme vous pouvez le constater vous même la map contient un String(nom du type)
comme clé et un Long(NumType) comme valeur.Mon idée c'est de pouvoir afficher le nom du type dans la liste et si je sélectionne 
un nom du type de pouvoir récupérer sa valeur que je transforme ensuite en une instance du type produit
 pour la soumission du formulaire.*/
	private Map<String,Long> mapDesTypes = new HashMap<String,Long>();

        public Map<String,Long> getMapDesTypes() {
		for(TypeProduit_Entity tpe : getListe()){
			mapDesTypes.put(tpe.getNomType(),tpe.getNumType());
		}
		return mapDesTypes;
	}
Le code de l'entité où le type du produit est une clé étrangère :

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
 
@Entity
@Table(name = "produit")
public class Produit_Entity implements Serializable{
 
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "NumProduit")
	private Long numProduit;
	@Column(name = "NomProduit")
	private String nomProduit;
	@Column(name = "PrixUnitaire")
	private Long prixUnitaire;
	@ManyToOne
	@JoinColumn(name = "NumType")
	private TypeProduit_Entity typeproduit;/*clé étrangère dont je dois créer une liste déroulante contenant des instances de TypeProduit_Entity afin que je puisse lui affecter une valeur via JSF*/
J'ai mis en place un convertisseur qui me permet de récupérer la valeur de l'élément sélectionné et chercher l'instance du type du produit correspondant et la retourner afin de m'en servir pour l'insertion.Voici le code du convertisseur :

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
@ManagedBean
public class typeproduitSelectionner implements Converter,Serializable {

	private static final long serialVersionUID = 1L;
	private static final String TYPE_NON_TROUVE = "Type du produit introuvable.";
	@EJB
       private TypeProduit_dao typeproduitDAO;
       TypeProduit_Entity tpEntity;

	@Override
	public TypeProduit_Entity getAsObject(FacesContext contexteJSF, UIComponent composant, String valeur) {
		Long numTypeProduit = Long.parseLong(valeur);
        try{  
            if(typeproduitDAO.trouverTypeProduit(numTypeProduit) != null){
         	    tpEntity = typeproduitDAO.trouverTypeProduit(numTypeProduit);/*Je vous fournis juste après le code du convertisseur le code de la méthode trouverTypeProduit qui recherche le type du produit correspondant à la valeur récupérée.*/
            }else{
    		      throw new ConverterException(new FacesMessage( FacesMessage.SEVERITY_ERROR,TYPE_NON_TROUVE, null ));
            }   
        }catch(DAOException d){
     	   FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, d.getMessage(), null );
    		   FacesContext facesContext = FacesContext.getCurrentInstance();
    		   facesContext.addMessage( composant.getClientId(facesContext), message );
        }
		return tpEntity;
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
		String valeur = String.valueOf(value);
		return valeur;
	}

}
Voici le code de la méthode trouverTypeProduit comme promis :

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
 
public TypeProduit_Entity trouverTypeProduit(long numType){
 
	       @PersistenceContext(unitName = "Optimus_Gestion_Stock")
	        private EntityManager interaction_Avec_BDD;
 
		TypeProduit_Entity typeProduitEntite;
		try {
			typeProduitEntite = interaction_Avec_BDD.find(TypeProduit_Entity.class, numType);
		}catch ( NoResultException e ) {
	          return null;
	    }catch ( Exception e ) {
	         throw new DAOException( e );
	    }
		return typeProduitEntite;
	}
Enfin voici le code de la liste déroulante dans le fichier xhtml :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
<h:outputLabel for="type">Type du produit : <span class="requis">*</span></h:outputLabel>
<h:selectOneMenu id="type" maxlength="60" value="#{produit_Managed.produit.typeproduit}"><!--produit_Managed est le bean managed dans lequel j'ai instancié l'entité produit-->
    <f:selectItem itemLabel="Sélectionnez..." itemDisabled = "true"/>    
    <f:selectItems value="#{typeProduit_Managed.mapDesTypes}"/>
    <f:converter binding="#{typeproduitSelectionner}" />
    <f:ajax event="blur" render="typeMessage" />
</h:selectOneMenu>
<h:message id="typeMessage" for="type" errorClass="erreur" />
N.B : je signale que je récupère bien la valeur et la méthode trouverTypeProduit fait parfaitement son boulot.D'après ce que j'ai mis en place tout me semble correct mais je me demande bien si j'ai bien compris le fonctionnement d'une liste déroulante (surtout contenant des données provenant d'une autre entité) en JSF ou bien c'est peut-être dans l'attribut value de <h:selectOneMenu> que je fournis pas la bonne expression langage ou bien j'ai peut-être mal déclaré la clé étrangère,ou bien peut-être c'est le type de la Map qui n'est pas bon bref,si ce que j'ai fait n'est pas la manière de procéder,comme je l'ai dit plus haut si quelqu'un a des liens,tutos ou même bouts de code traitants ce cas son aide me serai vraiment précieuse car je suis vraiment désespéré.
Merci d'avance!!!