IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Converter : getAsObject


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut Converter : getAsObject
    bonjour tout le monde,
    pour les besoins de mon application, j'ai créé un selectOneMenu à partir de 2 entités, afin de differencier les 2 au sein de ce composant, les valeurs pris en parametre du selectItem sont donc : 1 objet (pour la valeur retournée) et 1 String (pour le libelle)
    jusqu'ici tout va bien.....
    Cependant afin que tout ceci marche correctement je dois mettre en place un converter et la methode getAsObject me pose probleme, je ne vois pas du tout comment l'implementer, getAsString c'est fait

    Mon selectitems

    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
    /**
             * Positionne la liste des items de ressources
             */
    	private void setAllUTRessourceAsSelectItems() {
    		if (allUniteTravailRessourceItems != null) {
    			allUniteTravailRessourceItems.clear();
    		} else {
    			allUniteTravailRessourceItems = new ArrayList<SelectItem>();
    		}
     
    		// Traitement pour la recuparation des unites de travail
    		List<UniteTravail> unites = new ArrayList<UniteTravail>();
    		try {
    			unites = publicFacade.uniteTravailFindByCriteres(null, null, null);
    		} catch (Exception ex) {
    			logger.error(ex.getMessage());
    			return;
    		}
     
    		//Traitement pour la recuparation des ressources
    		List<Ressource> ressources = new ArrayList<Ressource>();
    		try {
    			ressources = publicFacade.ressourceFindByCriteres(null,
    					Statut.ENABLE);
    		} catch (Exception ex) {
    			logger.error(ex.getMessage());
    			return;
    		}
     
    		//Creation de la liste : UniteTravail + Ressources
    		allUniteTravailRessourceItems.add(new SelectItem("","-- Liste des Groupes --"));
    		for (UniteTravail item : unites) {
    			String libelle = item.getLibelle();
    			allUniteTravailRessourceItems.add(new SelectItem(item,
    					libelle));
    		}
    		allUniteTravailRessourceItems.add(new SelectItem("",""));
    		allUniteTravailRessourceItems.add(new SelectItem("","-- Liste des Ressources --"));
    		for (Ressource item : ressources) {
    			UniteTravail utItem = publicFacade.uniteTravailFindByPrimaryKey(item.getUnitetravail().getIdunitetravail());
    			String libelle = item.getNomPrenomsAsString();
    			allUniteTravailRessourceItems.add(new SelectItem(item,
    					libelle+" ("+utItem.getLibelle()+")"));
    		}
    	}
    et mon 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public class UniteTravailRessourceConverter implements Converter {
     
    	public Object getAsObject(FacesContext context, UIComponent component,
    			String value) {
     
     
    		if (context == null || component == null)
    			throw new NullPointerException();
    		if (value == null)
    			return null;
    		value = value.trim();
    		if (value.length() < 1)
    			return null;
     
    		PublicFacade publicFacade = ServiceLocator.getLocator()
    		.getPublicFacade();		
    		try{
    			Integer idressource = Integer.parseInt(value);			
    			return publicFacade.ressourceFindByPrimaryKey(idressource);
    		}catch(NumberFormatException nfe){
    			try{				
    				return publicFacade.uniteTravailFindByCriteres(value,null,null);
    			}catch(Exception e){
    				e.getCause().getMessage();
    				return null;
    			}
    		}
     
    		/*if (context == null || component == null)
    			throw new NullPointerException();
    		if (value == null)
    			return null;
    		value = value.trim();
    		if (value.length() < 1)
    			return null;
    		try {
    			PublicFacade publicFacade = ServiceLocator.getLocator()
    			.getPublicFacade();		
    			if(value.getClass().equals(UniteTravail.class)){				
    				return publicFacade.uniteTravailFindByPrimaryKey(Integer.parseInt(value));
    			}else if(value.getClass().equals(Ressource.class)){
    				return publicFacade.ressourceFindByPrimaryKey(Integer.parseInt(value));
    			}
    		} catch (Exception e) {
    			throw new ConverterException(Util
    					.getExceptionMessage(Util.CONVERSION_ERROR_MESSAGE_ID));
    		}	*/	
    	}
     
    	public String getAsString(FacesContext context, UIComponent component,
    			Object value) {
     
    		if (context == null || component == null)
    			throw new NullPointerException();
    		if (value == null)
    			return "";
    		if (value instanceof String)
    			return (String) value;
    		try {			
    			if(value.getClass().equals(UniteTravail.class)){
    				UniteTravail utr = (UniteTravail)value;	
    				return utr.getLibelle();
    			}else if(value.getClass().equals(Ressource.class)){
    				Ressource utr = (Ressource)value;
    				return utr.getIdressource().toString();
    			}
    			return "";
    		} catch (Exception e) {
    			throw new ConverterException(Util
    					.getExceptionMessage(Util.CONVERSION_ERROR_MESSAGE_ID));
    		}
    	}
     
    }
    la je seche
    Apparement le ti bout de code que j'ai créé me retourne bien 1 objet (celui desiré selon le cas) mais rien ne se passe par la suite

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    lorsque tu soumet tes données, le liste de ton selectitem est-elle toujours présente dans le bean? Le composant de JSF va faire çà:

    1) prendre le string envoyée par le browser
    2) la convertir en objet
    3) comparer cet objet avec l'ensemble des élements présent dans les selectitems (via donc ton bean)
    4) si l'élément est présent, l'accepter comme valeur, sinon considérer qu'aucune valeur n'a été envoyée.


    Si en trois la liste est vide lors de la soumission, c'est cuit (c'est l'erreur la plus courante, on défini la liste dans une action, mais la liste est request scope -> n'existe plus à la soumission)

  3. #3
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    salut,
    je ne vois pas du tout comment testé si j'ai des valeurs dans ma liste car la methode d'action n'est jamais appelé on dirait , j'ai mis une ligne de commentaire au debut de la methode qui n'apparait jamais dans la console

    au cas ou ca pourrait servir je met le code jsf correspondant
    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
    <fieldset style="width:98%"><legend>Affectation</legend>
    					<a4j:outputPanel id="intervenantOPanel">
    						<c:if test="#{creation or edition}">
    							<h:panelGrid columns="1" styleClass="infos" cellspacing="0"
    							cellpadding="0" columnClasses="label,input"
    							style="margin-top: 5px">							
    							<h:panelGroup>							
    								<h:selectOneMenu id="uniteTravrailRessource" styleClass="SELECT"
    									onfocus="onFocus(this);" onblur="onBlur(this);"
    									required="true" tabindex="18" value="#{beanController.objetUTR}" converter="uniteTravailRessourceConverter">
    									<f:selectItem itemLabel="-- Sélectionnez l'affectation --"
    										itemValue="" />
    									<f:selectItems value="#{referenceDataBean.allUniteTravailRessourceItems}" />										
    								</h:selectOneMenu>
    								<h:graphicImage alt="Champ obligatoire"	url="/images/i-alert.gif" styleClass="image" />
    									<h:message for="uniteTravail" styleClass="text-error" />
    							</h:panelGroup>
    							</h:panelGrid>
    						</c:if>
    						<c:if test="#{visualisation}">
    							<h:panelGrid columns="1" styleClass="infos" cellspacing="0"
    							cellpadding="0"	style="margin-top: 5px">
    							<h:panelGroup>
    								<h:outputText value="#{beanController.demande.uniteTravailAsString}" styleClass="text-normal-bold"/>								
    								<h:outputText value=": #{beanController.demande.intervenantAsString}"/>
    							</h:panelGroup>							
    							</h:panelGrid>
    						</c:if>
    					</a4j:outputPanel></fieldset>

    edit : ceci dit mon selectItem est créé et initilisé dans un bean scope application

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    de fait si c'est application scope, c'est pas le problème

    as-tu bien implémenté la méthode "equals" sur la class utilisée comme valeur? Parce que JSF utilise equals pour comparer la submitted value à la select list.

  5. #5
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    ah non ca j'ai pas fait par contre !
    je test

  6. #6
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    Ma methode equals dans l'entité UniteTravail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @transient
    public boolean equals(Object o) {
    		UniteTravail unitetravail = (UniteTravail)o;
    		return unitetravail.getCode().equals(getCode());
    	}
    j'ai fait la meme dans ressource

    mais j'ai droit a un message me disant que je ne peux pas caster un String en UniteTraval

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertion char vers int
    Par barthelv dans le forum C
    Réponses: 8
    Dernier message: 08/10/2011, 21h45
  2. Converter: getAsObject n'est pas appellée
    Par wushual1 dans le forum JSF
    Réponses: 13
    Dernier message: 12/05/2009, 09h52
  3. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46
  4. [Debutant] [Date] convertion date
    Par BenoitM dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 17/04/2003, 14h55
  5. Convertion de type VARIANT à type CString
    Par j_grue dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2002, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo