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 générique et sécurisé


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Converter générique et sécurisé
    Bonjour,

    voici maintenant 4 ans que je "joue" avec JSF et avant hier j'ai eu un idée qui me parait vraiment étrange de ne pas l'avoir eu avant, ni même vue ailleurs sur le net dans divers forums (et en particulier sur celui-ci)

    j'ai toujours un peu trouvé fastidieux de faire un converter pour chacune de mes classes métier afin d'avoir un "getAsString" pour que JSF en fasse son affaire, et un "getAsObject" pour que je retrouve mes billes côté JAVA (instances).

    Et donc j'ai écrit le converter suivant qui me simplifie la vie (très largement) :

    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
    @ManagedBean
    @ViewScoped
    public class GenericSecuredConverter implements Converter, Serializable {
     
        private Map <UUID, Object> temporaryStore = new HashMap <UUID, Object> ();
     
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            return temporaryStore.get(UUID.fromString(value));
        }
     
        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value) {
            UUID id = UUID.randomUUID();
            temporaryStore.put(id, value);
            return id.toString();
        }
    }
    L'idée de ce Converter est d'associer temporairement, le temps de la vue (D'où le @ViewScoped), une Map de UUID et d'instance d'objet.

    Ensuite pour utiliser ce genre de converter, j'utilise l'attribut "converter" et une EL, sur mon composant JSF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:selectOneMenu value="#{userBean.rank}" converter="#{genericSecuredConverter}">
       <f:selectItem itemDisabled="true" itemLabel="Select a rank ..." />
       <f:selectItems value="#{rankFacade.rankList}" var="localRank" itemLabel="#{localRank.fullText}" />
    </h:selectOneMenu>
    Ca marche parfaitement bien. En plus côté "HTML", j'ai donc des UUID sous forme de String qui sont dans la page. Ces UUID, qui n'existent que le temps de la vue, ont une vocation unique ce qui permet de sécuriser l'application (d'où le nom d'oiseau à mon converter : "GenericSecuredConverter" )

    Ca marche tellement bien que je me demande s'il n'y a pas un "loup" derrière tout ça. J'ai confronté mon "Converter" à d'autres développeurs, et eux aussi trouvent ça très bien et ne voient aucun problème ... ce qui me parait d'autant plus étrange.

    Je suis ouvert à vos critiques (à part sur les UUID qui peuvent entrer en conflit, je ne sais plus quelle est la probabilité, mais elle est totalement négligeable)

    PS : désolé si y'a pas la JavaDoc dans mon extrait de code, trop pressé d'avoir vos commentaires ...

  2. #2
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Par défaut
    Bonjour,

    j'ai vu sur le forum que votre converter a pu aider quelques personnes. Lorsque j'applique votre converter, il n'y a pas d'erreurs mais le résultat est le meme que si je ne l'utilise pas : Erreur de conversion lors de la définition de la valeur «9» pour «null Converter».

    Je désire lutiliser dans un formulaire afin de valider un integer (clef etrangere), je voulais savoir d'abord si votre converter peut etre utilisé pour un integer?
    Malgré tous les sites parcourus, je n'ai pas vraiment compris dans quels cas on devait utiliser ces converter et comment on savait s'il fallait le passer en string, en objet, en int et à quel moment.

    Je vous remercie d'avance.

  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
    Bonjour Zanka,

    ce converter est fait justement pour "gérer" directement des instances et pas uniquement des clés étrangères.

    En gros, quand une liste ou une instance est parcouru par JSF avec ce converter, des numéros uniques sont générées dans la vue.

    Ensuite ce numéro unique permet de "récupérer" directement l'instance sans avoir à coder un converter spécifique, au niveau d'un ManagedBean

    donc en gros ça sert pour les selectOneMenu, le case à cocher, les boutons radios, c'est à dire là où on veut "récupérer" l'instance d'une classe du modèle.

    Je dois avoir une démo qui traîne qq part, j’essaierai de la poster demain dans l'après-midi, si j'ai un peu de temps.


    Est-ce que tu peux montrer le code dans lequel tu tentes d'utiliser ce converter pour voir si ça convient ?

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Par défaut
    Voici le formulaire :
    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
    <ui:composition 
        template="/WEB-INF/template/template.xhtml" 
        xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:p="http://primefaces.org/ui" >
     
    <ui:define name="contenu">
        <p:messages id="messages" autoUpdate="true"/>
                <h:form>
                    <h1><h:outputText value="Mise à jour"/></h1>
                    <h:panelGrid columns="2" >
                        <h:outputLabel value="Identifiant : " for="idService" />
                        <h:inputText id="idService" value="#{serviceManagedBean.details.idService}" 
                                     title="idService" required="true" 
                                     requiredMessage="The idService field is required." readonly="true" />
     
                        <h:outputLabel value="Libellé :" for="libService" />
                        <h:inputText id="libService" value="#{serviceManagedBean.details.libService}"                                  
                                     title="libService" required="true" 
                                     requiredMessage="The libService field is required."/>
                        <h:outputLabel value="IdProcessus:" for="idProcessus" />
                        <h:selectOneMenu id="idProcessus" value="#{serviceManagedBean.details.idProcessus}" converter="#{ConverterManagedBean}"
                                         title="IdProcessus" required="false" requiredMessage="The IdProcessus field is required.">
     
                            <f:selectItems value="#{processusManagedBean.idProcessus}"/>
                            <!-- TODO: update below reference to list of available items-->     
                        </h:selectOneMenu>
     
                    </h:panelGrid>
                    <h:commandButton id="back" value="Back" action="ServiceList"/>
                    <h:commandButton id="update" value="Update" action="#{serviceManagedBean.update}"/>                
                    <h:commandButton id="remove" value="Delete" action="#{serviceManagedBean.remove}"/>
                </h:form>
    </ui:define>
    </ui:composition>
    Où "processusManagedBean.idProcessus" est la liste des clef etrangere idProcessus existantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public List<Integer> getIdProcessus() {
            return processusBean.getAllIdProcessus();
        }
    Après avoir comparé avec d'autres exemple, je crois avoir compris qu'il faut plutot que j'utilise cette liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public List<Processus> getProcessus() {
            return processusBean.getAllProcessus();
        }
    Mais si je le fais, j'obtiens cette erreur lors de l'update :

    Erreur de conversion lors de la définition de la valeur «entities.Processus[ idProcessus=9 ]» pour «null Converter».

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 19
    Par défaut
    Merci pour le paratage.

    Je voudrai aller un peu plus loin avec votre convertisseur, pour qu'il me crée mes objets s'ils n'existent pas dans la map car je voudrai permettre à mes utilisateurs de rajouter des objets également à la liste si les objets n'existent pas (un peu comme le fait facebook et d'autres sites maintenant).
    Pour cela j'ai pensé à utiliser la généricité Java, c'est à dire remplacer la classe Object par une classe générique T (MonConverter<T>) et instancier un objet avec le bon type T dans le getObject quand il n'existe pas.
    Mon problème c'est que je n'arrive pas à dire aux JSF d'instancier mon Bean avec un type d'objet donné sachant que je passe par code pour instancier le bean converter à l'aide de l'annotation managedProperty.
    Avez vous une idée de comment faire cela.

    Merci

  6. #6
    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
    Okay, je vois ce que tu souhaites faire, je vais y réfléchir et je te tiens au courant. Mais je crois qu'il va falloir abandonner @ManagedProperty ... pas sûr, mais je pense.

Discussions similaires

  1. [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
  2. psqlODBC est-il sécurisé?
    Par Hannibal dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 10/06/2003, 11h21
  3. [Debutant] [Date] convertion date
    Par BenoitM dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 17/04/2003, 14h55
  4. Portail avec Paiement Sécurisé
    Par LLaurent dans le forum XMLRAD
    Réponses: 2
    Dernier message: 20/02/2003, 17h27
  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