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 :

Modification de la fonction Validate() :javax.faces.validator.Validator


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut Modification de la fonction Validate() :javax.faces.validator.Validator
    Bonjour,

    Dans une application jsf....
    lorsque j'utilise la validationDoubleRange, le message afficher est en severity ERROR ce qui me dérange un peu car j'aimerais qu'il soit en severity WARN.
    les messages en severity ERROR sont utilisés dans l'application pour des messages d'exception plus graves qu'un formulaire avec un champs "required".

    Ma question va alors etre clair et concise:

    la fonction qui fait appel à cette écriture et affichae de message se trouve dans la class DoubleRangeValidator implementant l'interface validator et plus exactement dans le Override de la methode validate().Cette methode fait appel a plusieurs autres methodes de la class _MessageUtils et plus exactement la methode getErrorMessage()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     static FacesMessage getErrorMessage(FacesContext facesContext,
                                            String messageId,
                                            Object args[])
        {
            return getMessage(facesContext,
                              facesContext.getViewRoot().getLocale(),
                              FacesMessage.SEVERITY_ERROR,
                              messageId,
                              args);
        }
    En gros et pour faire simple, comment créer dans cette class une autre methode identique a celle ci dessus mais en SEVERITY_WARN que je pourrais appeler dans ma class de validation ou bien meme dans la validationDoubleRange qui existe deja?
    comment pourrais-je modifier cette class car je n'y ai acces qu'en readOnly?

    Merci d'avance ,
    si quelqu'un arrive à me repondre clairement je lui en serais rééllement redevable!!

    Bonne soirée.

  2. #2
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    Bonjour Johnlobs.

    En gros et pour faire simple, comment créer dans cette class une autre methode identique a celle ci dessus mais en SEVERITY_WARN que je pourrais appeler dans ma class de validation ou bien meme dans la validationDoubleRange qui existe deja?
    comment pourrais-je modifier cette class car je n'y ai acces qu'en readOnly?
    Pour moi le plus simple serait que tu fasse une classe qui hérite de la classe DoubleRangeValidator dans laquelle tu redéfinie la méthode validate pour renvoyer un message de sévérité "warn".
    Puis au lieu d'utiliser directement la classe fournie par JSF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:validateDoubleRange minimum="3.0" maximum="4.5" />
    tu utilise directement celle que tu viens de creer (en référençant le nom que tu mettra dans l'annotation @FacesValidator dans ta classe custom)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:validator validatorId="doubleRangeValidatorCustom" minimum="3.0" maximum="4.5"/>

  3. #3
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut
    Salut Lacunasaurus,

    Je te remercie pour ta réponse claire.
    Le soucis est que c'est la class MessageUtil qui pose problème car c'est à ce niveau la que le message se construit et est affiché.cette class n’étant pas public je n'arrive pas à overrider la methode getErrorMessage().

    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
     
    package javax.faces.validator;
     
    import java.security.AccessController;
    import java.security.PrivilegedActionException;
    import java.security.PrivilegedExceptionAction;
    import java.util.Locale;
    import java.util.MissingResourceException;
    import java.util.ResourceBundle;
     
    import javax.el.ValueExpression;
    import javax.faces.FacesException;
    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
     
    class _MessageUtils
    {
        private static final String DETAIL_SUFFIX = "_detail";
     
        static FacesMessage getErrorMessage(FacesContext facesContext,
                                            String messageId,
                                            Object args[])
        {
            return getMessage(facesContext,
                              facesContext.getViewRoot().getLocale(),
                              FacesMessage.SEVERITY_ERROR,
                              messageId,
                              args);
        }
    à ce niveau on voit bien que cette methode fait appel à getMessage() avec comme parametre SEVERITY_ERROR
    ce qui affiche le message de validation comme un message d'erreur system ce qui me derrange.
    Si j'applique ton idée ,il va falloir tout refaire et si jamais j'herite de DoubleRangeValitator, le probleme restera identique car celle ci fera appel à cette fonction d'affichage.

    Je me suis amusé a faire ce que tu m'as proposé mais il y a trop de class a implémenter et je me retrouve dans un cercle vicieux ....

    le problème de doubleRangeValidator a été reglé par l'utilisation pe:inputNumber de primefaces extension qui est mille fois mieux et qui ne permet même pas une saisie incorrecte sans passer pas un message.

    Le probleme est maintenant lié a qui me donne un message d'erreur en severity_error.
    je dois changer cela dans le projet sans pour autant modifier les messages d'erreur system qui eux doivent rester en severity_error.
    je veux qu'a chaque fois que j 'utilise dans mon html required avec le requiredmessage,mon affichage soit en WARN;

    je remercie toute aide potentielle et espere que ce sujet en interressera plus d'un.

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    Désolé johnlobs, je crois que je me suis mal exprimé

    En fait tu veux modifier la classe MessageUtils alors que tu n'a pas besoin de la toucher.
    Toi ce que tu veux c'est que le message de validation renvoyé par le validateur ai une autre sévérité que celle par défaut, et non pas modifier toutes les messages d'erreur en WARNING plutôt que ERROR.

    Je me suis prêté au jeu avec le composant de primefaces comme tu le mentionne dans ton dernier message cependant la solution marche très bien avec le validateur de JSF

    Pour le HTML dans la balise form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <p:inputNumber id="input1" value="#{inputNumberView.input1}">  
      <f:validator validatorId="customDoubleRangeValidator" minimum="10" maximum="20" />
    </p:inputNumber> 
    <h:message for="input1" style="color:orange" />
    Le bean juste pour l'exemple
    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
     
    @ManagedBean(name = "inputNumberView")
    @RequestScoped
    public class InputNumberView {
     
        private Double input1 = new Double(0);
     
        public Double getInput1() {
            return input1;
        }
     
        public void setInput1(Double input1) {
            this.input1 = input1;
        }
    }
    et enfin le validateur qui hérite de DoubleRangeValidateur

    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
     
    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    import javax.faces.validator.FacesValidator;
    import javax.faces.validator.ValidatorException;
    import org.primefaces.validate.DoubleRangeValidator;
     
    @FacesValidator("customDoubleRangeValidator")
    public class CustomDoubleRangeValidator extends DoubleRangeValidator {
     
        @Override
        public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
            FacesMessage msg = new FacesMessage("Validation failed.", "Invalid input number.");
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
            throw new ValidatorException(msg);
        }
    }
    et le rendu

    Nom : exemple validateur custom.PNG
Affichages : 300
Taille : 2,1 Ko

    J'espère que cet exemple t'aidera plus

  5. #5
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut
    Salut Lacunasaurus,

    Je te remercie pour tes réponses qui sont très intéressantes...

    Je retiens ton code pour mes futures validateurs;pour ce cas j'ai contourné le probleme en utilisant inputNumber de primefaces extension qui m'offre un meilleur resultat en empechant la saisie de tout nombre ne respectant pas les min et max definis je trouve que c'est meilleur car pas la peine d'afficher un message et forcer l'utilisateur a modifier sa saisie.

    Le problème que j'ai maintenant concerne la validation grâce a "required=true".est ce que je dois implementer une Custom validation pour cela aussi?
    si c'est le cas je dois heriter de quelle classe pour surcharger la methode validate?

    Merci !!!
    Au plaisir de te lire....

  6. #6
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    required=true".est ce que je dois implementer une Custom validation pour cela aussi?
    En fait le required=true n'est pas du tout une sécurité, c'est ce que l'on peu appeler de l'ergonomie sécuritaire (en gros tu guide ton utilisateur pour saisir une donnée attendue).
    Mais rien n'empêche un utilisateur mal intentionné d'éditer la page html en local sur son poste pour le retirer et envoyer une donnée vide à ton serveur.

    Tu as donc 3 solutions :
    1 - Ajouter une annotation @NotNull sur l'attribut de la classe (package javax.validation.constraints.NotNull)
    Cela te remontera une erreur dont le message peu être customisé en ajoutant la clé et le message souhaité dans ton fichier d'internationalisation des messages JSF
    2 - Créer ton propre validateur pour géré ce cas (ca me semble overkill pour une contrainte si simple)
    3 - Tu test la valeur dans ton contrôleur et tu rajoute un message d’erreur en retour si la valeur est vide

    J'aime bien la solution 1 cependant le message d'erreur sera le même pour tous les champs que tu annotera @NotNull (ce qui peut être bien vu qu'un champ obligatoire ... reste un champ obligatoire peu importe son type de donnée)

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

Discussions similaires

  1. Power Pivot / Fonction DAX avec IF non valide
    Par Mathsdeb dans le forum Excel
    Réponses: 4
    Dernier message: 19/04/2015, 00h05
  2. Fonction mail() avec mail non valide
    Par Cruz_Castillo dans le forum Langage
    Réponses: 4
    Dernier message: 11/12/2013, 23h52
  3. images en fonction d'une liste de validation
    Par alsimbad dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/07/2007, 17h30
  4. Modifer une valeur dans un panier sans la valider
    Par budiste dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2006, 09h53

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