Deux primefaces composant de calendrier de validation

J'ai un formulaire dans JSF 2 où je suis à l'aide d'un double champ pour spécifier une plage de dates. Le but est de ne pas laisser à l'utilisateur de sélectionner une première date qui est avant la seconde. Je tiens donc à effectuer une validation, avant que le formulaire est envoyé, à l'aide de p:calendar composants. Ce que j'ai à faire est de lier un programme de validation de la deuxième calendrier d'entrée pour accéder à la première composante interne et comparer des dates.

Ici c'est ma xhtml page:

<html 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">

<h:head />
<h:body>
    <h:form id="date_form">
        <p:calendar id="date1input" value="#{dateTestBean.date1}" />
        <p:calendar value="#{dateTestBean.date2}" validator="dateValidator">
            <f:attribute name="date1" value="#{date1input}" />
        </p:calendar>
        <p:commandButton value="Submit" action="#{dateTestBean.submit}"
            ajax="false" />
    </h:form>
</h:body>
</html>

Mon managed bean:

@ManagedBean
@ViewScoped
public class DateTestBean {

    private Date date1;

    private Date date2;

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public void submit() {
        System.out.println("Submited " + date1 + " " + date2);
    }

}

Ma classe de validation:

@FacesValidator(value = "dateValidator")
public class DateValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {
        System.out.println(((UIInput) context.getViewRoot().findComponent(
                "date_form:date1input")).getValue());
        UIInput date = (UIInput) component.getAttributes().get("date1");
        System.out.println(date);
        //Will perform date comparison
    }
}

La sortie je reçois ici l'envoi de 2013-10-10 comme première date et 2013-10-12 comme deuxième est:

Jeu Oct 10 00:00:00 CEST 2013

null

Soumis Jeu Oct 10 00:00:00 CEST 2013 Sam Oct 12 00:00:00 CEST 2013

Qui suggère f:attribute balise ne fonctionne pas pour p:calendar composant comme pour les autres composants d'entrée. Cependant, je peux accéder à la première du calendrier via affichage de la racine, mais applique-moi connaître le chemin d'accès complet de l'id du client du composant je veux valider. Les deux valeurs sont définies dans le managed bean plus tard sans problèmes.

Une solution de contournement serait pour utiliser un appel ajax lors de la première date de changements afin de le placer dans le modèle et l'envoyer en date lui-même dans le f:attribute au lieu d'envoyer le UIInput (je fais déjà ça).

N'est-il pas une meilleure façon? J'ai peut-être à se joindre à eux dans un seul composant comme dans ce cas?

  • Le #{date1input} ne fait pas référence id="date1input", au contraire, il est censé se référer binding="#{date1input}". Vérifiez ces exemples avec plus de soin.
  • double possible de plage de Date de validation
  • C'est vrai! Je n'ai pas vu que cela fait du sens parce que ce que vous êtes de passage est le bindings du composant de référence au lieu de l'id lui-même. Mais assure également que vous l'ayez relié, qui est à mon humble avis un point négatif. Probablement le meilleur pari est de mettre en œuvre une double entrée composante et la validation d'un seul coup.
  • Pour votre aversion apparente contre l'utilisation de binding: lire attentivement ceci comment l'utiliser correctement. Il est en effet mal quand mal compris et mal utilisé. Quant à la "meilleure" approche, avez-vous regardé le OmniFaces façon dans les liens en double? Pas de liaison, pas de f:attribut, aucun autre dégât. Juste un <o:validateOrder components="startDateId endDateId" /> tag et c'est tout.
  • Merci beaucoup @BalusC, Omnifaces m'a aidé à atteindre cet objectif. Toutefois, il semble se briser lorsqu'au moins une des composantes est nulle (NPE). Mes composants ne sont pas nécessaires, je ne veux vérifier leur ordre, si les deux ne sont pas null. Il ne semble pas être spécifié dans la documentation, ni dans validateOrder ou validateAll. De toute façon, merci pour votre contribution!
  • Si vous rencontrez un problème par tous les moyens pour signaler un problème.

InformationsquelleAutor Xtreme Biker | 2013-10-25