Question

Le code suivant crée deux boutons radio.Chaque option contient une valeur de date qui a été convertie avec succès en une étiquette au format «aaaa-MM-jj».Une fois que je fais une sélection et clique sur le bouton suivant, j'obtiens l'erreur suivante "j_idt12: comDateChoice: Erreur de validation: la valeur n'est pas valide".Cela semble assez simple mais quelque chose ne va pas.L'un de vous peut-il le repérer?

J'utilise JSF 2.0 dans Glassfish.

Haricot de soutien

public List<SelectItem> getComDateList() {
    List<SelectItem> items = new ArrayList<SelectItem>();
    Calendar cal = GregorianCalendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.add(Calendar.MONTH, 1);
    Date nextFirst = cal.getTime();
    cal.add(Calendar.MONTH, 1);
    Date followingFirst = cal.getTime();
    items.add(new SelectItem(nextFirst, new SimpleDateFormat("yyyy-MM-dd").format(nextFirst)));
    items.add(new SelectItem(followingFirst, new SimpleDateFormat("yyyy-MM-dd").format(followingFirst)));
    return items;
}

Code JSF

<h:panelGrid columns="2">
                    <h:outputLabel value="#{msg.FinanceCommencementDate}" for="comDateChoice"/>
                    <h:selectOneRadio id="comDateChoice" value="#{signUpBean.current.commencementDate}" layout="pageDirection">
                        <f:convertDateTime type="date" dateStyle="short"/>
                        <f:selectItems  value="#{signUpBean.comDateList}"/>
                    </h:selectOneRadio>
                </h:panelGrid>
Était-ce utile?

La solution

Cette erreur se produira si la valeur de l'élément sélectionné n'a pas réussi la vérification du Object#equals() sur l'une des valeurs d'élément de sélection disponibles. Cela peut se produire si le getter a renvoyé une liste différente pendant la phase d'application des valeurs de demande de la demande d'envoi de formulaire par rapport à la demande initiale d'affichage du formulaire.

Parce que vous reconstruisez la liste dans le getter au lieu de construire une fois dans le constructeur d'un bean à portée de vue, les objets Date recevront un horodatage différent à chaque appel, ce sera quelques minutes / secondes dans le futur par rapport aux objets Date initiaux. Par conséquent, le equals() échouera.

Déplacez cette logique dans le constructeur du bean et réécrivez le getter pour qu'il fasse ce qu'il est censé faire: ne renvoyer que les données . Ne chargez pas la logique dans un getter. Vous devez également mettre le bean dans la portée de la vue afin que le constructeur ne se relance pas lorsque vous soumettez le formulaire.

@ManagedBean
@ViewScoped
public class SignUpBean {

    private List<SelectItem> comDateList;

    public SignUpBean() {
        comDateList = new ArrayList<SelectItem>();
        // Fill it here.
    }

    public List<SelectItem> getComDateList() {
        return comDateList; // In getters, do nothing else than returning data!
    }

}

Mise à jour : le convertisseur est également une source potentielle du problème. Vous lui avez essentiellement demandé de supprimer le temps lors du rendu de la page HTML. Il utilise donc l'heure par défaut lors de la reconversion en Date. Soit utiliser

<f:convertDateTime pattern="yyyy-MM-dd HH:mm:ss.SSS Z" />

ou réinitialisez au préalable l'heure et le fuseau horaire sur le code générique de l'étiquette:

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.setTimeZone(TimeZone.getTimeZone("GMT"));

de cette façon, vous pouvez utiliser simplement un code générique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top