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 :

JSF Composants composites avec un Converter


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut JSF Composants composites avec un Converter
    Bonjour,

    Quand j'utiliser mon code directement dans ma page sa marche très bien avec le converter "la propriété suivante : converter="paysConvert" bien sûr "paysConvert" pointe sur ma classe "PaysConverter" (il est simple n'a rien de particulier, en même temps ces pas le probléme)

    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
    @FacesConverter(forClass=PaysConverter.class ,value="paysConvert")
    public class PaysConverter implements Converter{
     
        /** Creates a new instance of PaysConverter */
        public PaysConverter() {  }
     
     
        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value) {
     
            return String.valueOf( ((Pays) value).getId() ) ;
        }    
     
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
     
            Pays pays = new Pays();
            pays.setId(value);
     
            return pays ;
        }
     
    }
    Mais quand je l'utiliser dans un composant composite avec le même Converter j'ai le message suivant :
    Cannot convert paysConvert of type class java.lang.String to interface javax.faces.convert.Converter
    Voilà actuellement ce que j'ai fait dans mon composant composite
    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
     
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:composite="http://java.sun.com/jsf/composite"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:p="http://primefaces.prime.com.tr/ui"
          xmlns:ui="http://java.sun.com/jsf/facelets">
     
        <!-- INTERFACE -->
        <composite:interface>
     
            <composite:attribute name="titre" required="true" ></composite:attribute>
            <composite:attribute name="valeur" required="true"></composite:attribute>
            <composite:attribute name="labelSource" required="true" ></composite:attribute>
            <composite:attribute name="labelTarget" required="true"></composite:attribute>
     
            <composite:attribute name="converterPickList" required="true" ></composite:attribute>
            <composite:attribute name="champ_id" required="false"></composite:attribute>
            <composite:attribute name="champ_libelle" required="false" ></composite:attribute>         
     
        </composite:interface>
     
        <!-- IMPLEMENTATION -->
        <composite:implementation>
     
            <h3>#{cc.attrs.titre}</h3>  
            <p:pickList value="#{cc.attrs.valeur.dualList}"  
                        var="item" iconOnly="true" effect="bounce"  
                        itemValue="#{item}" itemLabel="#{item.id} -- #{item.libelle}"
                        converter="#{cc.attrs.converterPickList}"  
                        showSourceControls="true" showTargetControls="true">  
                <f:facet name="sourceCaption">#{cc.attrs.labelSource}</f:facet>  
                <f:facet name="targetCaption">#{cc.attrs.labelTarget}</f:facet>  
     
            </p:pickList>  
     
        </composite:implementation>
    </html>
    Si possible de me donner une solution possible.
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut [JSF2.0] Composants composites avec un Converter
    Je reformule mon problème en question très simplement :

    Est-il possible de convertir le résultat d'une EL un String a un autre type ? (dans mon cas a une objet d'une classe Converter)

    Si sa existe comment en peut le faire sinon comment je peux contournés ce problème.

    Merci

  3. #3
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    salut,

    montre une page où tu utilises ton composite.

  4. #4
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut
    Citation Envoyé par fxrobin Voir le message
    montre une page où tu utilises ton composite.
    Bonjour,

    Je n’ai pas peut montrais le code parce-que je suis en plais développement et test (en plain évolution) : mais voilà ou je suis

    Voilà c’est qu'il avait initialement (sans composant composite) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                <p:pickList value="#{labCtrl.pickListEntityPays.dualList}"  
                            var="pays" iconOnly="true" effect="bounce"  
                            itemValue="#{pays}" itemLabel="#{pays.id} -- #{pays.libelle}"
                            converter="paysConvert"  
                            showSourceControls="true" showTargetControls="true">  
                    <f:facet name="sourceCaption">Available</f:facet>  
                    <f:facet name="targetCaption">Starting</f:facet>
                </p:pickList>
    Avec composant composite :
    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
        <!-- INTERFACE -->
        <composite:interface>
     
            <composite:attribute name="titre" required="true" ></composite:attribute>
            <composite:attribute name="valeur" required="true"></composite:attribute>
            <composite:attribute name="labelSource" required="true" ></composite:attribute>
            <composite:attribute name="labelTarget" required="true"></composite:attribute>
     
            <composite:attribute name="converterPickList" required="true" ></composite:attribute>
            <composite:attribute name="champ_id" required="false"></composite:attribute>
            <composite:attribute name="champ_libelle" required="false" ></composite:attribute>         
     
        </composite:interface>
     
        <!-- IMPLEMENTATION -->
        <composite:implementation>
     
            <h3>#{cc.attrs.titre}</h3>  
            <p:pickList value="#{cc.attrs.valeur.dualList}"  
                        var="item" iconOnly="true" effect="bounce"  
                        itemValue="#{item}" itemLabel="#{item.id} -- #{item.libelle}"
                        converter="#{cc.attrs.converterPickList}"  
                        showSourceControls="true" showTargetControls="true">  
                <f:facet name="sourceCaption">#{cc.attrs.labelSource}</f:facet>  
                <f:facet name="targetCaption">#{cc.attrs.labelTarget}</f:facet>  
     
            </p:pickList>  
     </composite:implementation>
    Et je l’utilise de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                <elit:pickListEntity titre="My Basic PickListEntity" valeur="#{labCtrl.pickListEntityPays}"
                                     labelSource="Tous.." labelTarget="Choix.."
                                     champ_id="id" champ_libelle="libelle"
                                     converterPickList="paysConvert" >
                </elit:pickListEntity>
    Donc ces cette ligne qui cause problème « converterPickList="paysConvert" »


    donc c’est a l’utilisation de la propriété « converter » quand je l’utiliser du Composant Composite et quand je fais appel (avec balise <elit: >) j’ai le message ‘Cannot convert paysConvert of type class java.lang.String to interface javax.faces.convert.Converter’

    Messsage complé:
    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
    GRAVE: Error Rendering View[/administration/pagePickListEntity.xhtml]
    javax.el.ELException: /resources/elit/pickListEntity.xhtml @32,73 converter="#{cc.attrs.converterPickList}": java.lang.IllegalArgumentException: Cannot convert paysConvert of type class java.lang.String to interface javax.faces.convert.Converter
    	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
    	at javax.faces.component.UIOutput.getConverter(UIOutput.java:144)
    	at org.primefaces.component.picklist.PickListRenderer.encodeOptions(PickListRenderer.java:188)
    	at org.primefaces.component.picklist.PickListRenderer.encodeList(PickListRenderer.java:177)
    	at org.primefaces.component.picklist.PickListRenderer.encodeMarkup(PickListRenderer.java:90)
    	at org.primefaces.component.picklist.PickListRenderer.encodeEnd(PickListRenderer.java:51)
    	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
    	at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
    	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756)
    	at com.sun.faces.renderkit.html_basic.CompositeRenderer.encodeChildren(CompositeRenderer.java:78)
    	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756)
    	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:58)
    	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:46)
    	at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:225)
    	at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:148)
    	at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:75)
    	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763)
    	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)
    	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401)
    	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
    	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
    	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:232)
    	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
    	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
    	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
    	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    	at java.lang.Thread.run(Thread.java:662)
    Caused by: java.lang.IllegalArgumentException: Cannot convert paysConvert of type class java.lang.String to interface javax.faces.convert.Converter
    	at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:397)
    	at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:222)
    	at com.sun.faces.facelets.el.ContextualCompositeValueExpression.getValue(ContextualCompositeValueExpression.java:156)
    	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    	... 57 more
     
    INFO: {}: {}IllegalArgumentExceptionCannot convert paysConvert of type class java.lang.String to interface javax.faces.convert.Converter
    ATTENTION: PWC4011: Unable to set request character encoding to UTF-8 from context /Administration-war, because request parameters have already been read, or ServletRequest.getReader() has already been called
    INFO: p:resources component is deprecated and has no use in PrimeFaces 2.0 as JSF 2.0 resource apis are used instead to place resources on page.
    un grand merci d'avance

  5. #5
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut
    Bonjour,

    a défaut de trouvé une solution comment je peux la contournés ? (c’est ce qui ce passe généralement pour des erreur JSF)

    OU au moins quelqu'un peut -il m'expliqués la signification du message d'erreur (que ce passe t'il en interne pour avoir ce type de message complètement incroyable pour moi)

    cordialement
    geforce

  6. #6
    Membre expérimenté Avatar de Shinzul
    Homme Profil pro
    Lecteur assidu de code source
    Inscrit en
    Janvier 2008
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lecteur assidu de code source
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2008
    Messages : 174
    Par défaut
    Je n'ai pas travaillé sur les composite mais j'ai fais un peu le même genre de choses avec des UI Includes.

    Je pense que ton problème viens d'une mauvaise interprétation du champs a cause de la récupération d'un attribut.
    Si tu passe directement la valeur paysConvert dans l'attribut converter, JSF va aller chercher le converter associé dans ceux enregistrés. Mais il existe une deuxième façon de lier un converter, c'est de le mettre en attribut d'un managedBean et de le passe par une EL dans le champ <h:inputText converter="#{monBean.converterInstancie}" />.

    Ta problèmatique selon moi est que puisque tu passe une EL au converter, JSF interprète que la valeur passé doit être un converter or il s'agit d'une String d’où ton message d'erreur (Le type String est incompatible avec le type Converter).
    Pour vérifier essaye d'instancier un PaysConverter dans ton managedBean et au lieu de passer paysConvert a ton composant passe lui l'EL pointant dessus <p:pickList value="#{labCtrl.pickListEntityPays.dualList}" converter="#{labCtrl.paysConverter}" </p:pickList> par exemple.

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

Discussions similaires

  1. Composant composite et les action update de JSF
    Par geforce dans le forum JSF
    Réponses: 2
    Dernier message: 01/02/2012, 08h22
  2. Réponses: 1
    Dernier message: 07/12/2011, 20h18
  3. Réponses: 5
    Dernier message: 16/03/2009, 17h00
  4. Réponses: 2
    Dernier message: 04/04/2008, 17h21

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