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

Servlets/JSP Java Discussion :

Problème de dates (35/01 -> 04/02)


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut Problème de dates (35/01 -> 04/02)
    Bonjour tout le monde,

    Je débarque en maintenance sur une application qui utilise des vieilles versions (pre-release, candidates, etc...) de spring, spring webflow, hibernate, jstl et autres joyeusetés. J'ai compris un certain nombre de choses, je suis parvenu à en corriger d'autres sans pour tautant les comprendre et je sèche maintenant sur une bête validation de date.

    J'ai ceci dans une jsp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <%@ page language="java" errorPage="/error.jsp" %>
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
    <%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
    <%@ taglib uri="http://jakarta.apache.org/taglibs/input-1.0" prefix="input" %>
    <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
    <%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
    [...]
    <td class="input">
    <spring:bind path="command.saleContractDate">
    <input type="text" name="<c:out value="${status.expression}"/>"
    value="<fmt:formatDate value="${command.saleContractDate}" 
    type="date" pattern="dd/MM/yyyy" />" /></td>
    [...]
    Mon problème est que lorsque l'utilisateur entre une date du genre 35/01/2007, celle-ci est acceptée sans broncher et transformée ilico en un 04/02/2007 sans que je puisse faire la distinction dans mon code java avec un utilisateur qui aurait vraiment entre 04/02/2007. Le client n'est pas très content avec çà et je ne sais pas où et dans quelle librairie cette validation est faite... Je suppose que je pourrais transformer les champs date en champs texte et écrire par moi-même des routines de conversion ou en trouver toutes faites, mais je n'aime pas trop ce genre de bidouillage.

    QQn a-t-il une solution à proposer? Ou une indication d'où le problème se situe et comme quoi la mise à jour de l'une ou l'autre librarie pourrait régler le problème?...

    (L'upgrade des librairies utilisées demande un travail non-négligeable ici, parceque les pre-release et autres betas ont souvent des syntaxes qui ont bien changé ou des problèmes d'interopérabilité avec certaines versions d'autres librairies...)

    Merci à tous.
    -Phoxtrot

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Points : 439
    Points
    439
    Par défaut
    pour la date, il faut utiliser le paramètre "lenient" : javadoc
    et il est marqué :
    Specifies whether or not date/time interpretation is to be lenient. With lenient interpretation, a date such as "February 942, 1996" will be treated as being equivalent to the 941st day after February 1, 1996. With strict (non-lenient) interpretation, such dates will cause an exception to be thrown. The default is lenient.
    mais avant de modifier le code, il faut savoir où se fait le contrôle.
    question : si tu saisis autre chose qu'un format de date : jj/mm/aaaa qu'est ce qui se passe?
    tu peux regarder du côté de validator : fichier validator.xml?
    dans ton formulaire, y-at-il une méthode validate?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    J'ai un validator oui mais la date que je récupère du bean dans le validateur ne me permet pas de savoir si la date entrée par l'utilisateur a été modifée ou non. Si je demande par exemple le jour du mois alors que l'utilisateur a entré 35/01, j'aurai 4 comme réponse. La transformation a lieu en amont, dans l'une ou l'autre librairie...

    Mon bean utilise la classe Date pour le moment et non la classe calendar, je ne sais pas si je peux utiliser la classe calendar sans être embêté par hibernate, jstl, spring...

    Si je ne respecte par le format ##/##/####, certaines fantaisies sont acceptées ("11-03/2007blabla"), d'autres pas ("11d/03/2007")


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <td class="input">
    <spring:bind path="command.saleContractDate">
        <input type="text" name="<c:out value="${status.expression}"/>"
           value="<fmt:formatDate value="${command.saleContractDate}" 
           type="date" pattern="dd/MM/yyyy" />" /></td>
        <td></td>
        <c:if test="${status.error}">
            <td class="rmb_fieldError"><c:out value="${status.errorMessage}" />
            </td>
        </c:if>	
    </spring:bind>

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Points : 439
    Points
    439
    Par défaut
    peux-tu mettre le contenu du validator pour le champ concerné?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Ok, voici la partie pertinente aux dates
    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
     
     
     
    private void validate(Appendix ra, Errors errors) {
      Constants constants = (Constants) BeanService.getBean(Constants.class);
      if (ra.getSaleContractDate() == null) {
         errors.rejectValue("Appendix.saleContractDate", "4#1#error.not-specified", null, "Value required.");
      } else if (!isValidDate(ra.getSaleContractDate(), constants)) {
         errors.rejectValue("Appendix.saleContractDate", "4#1#error.invalid-value", null, "Invalid value.");
    }
     
    protected final boolean isValidDate(Date aDate, Constants constants) {
        boolean isValid = aDate.after(constants.getLowestDate())
                           && aDate.before(constants.getHighestDate());
        return isValid;
    }
    getSaleContractDate() est un simple getter sur le bean.

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Points : 439
    Points
    439
    Par défaut
    et j'imagine que dans la méthode isValidate, l'objet aDate est valuée au 04/02/2007 si tu avais saisi le 35/01/2007?

    si tu saisis une date "fdfdfdfd", quel type de message d'erreur as-tu?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par mattheox Voir le message
    et j'imagine que dans la méthode isValidate, l'objet aDate est valuée au 04/02/2007 si tu avais saisi le 35/01/2007?
    Oui

    si tu saisis une date "fdfdfdfd", quel type de message d'erreur as-tu?
    Voila une question qui de fil en aiguille m'a fait trouver la solution :-)

    En fait le message d'erreur est bien un message customisé, retrouvé dans la DB. Ceci m'a fait penser que le parsing générait une exception catchée qq-part dans l'application pour la transformer en un message d'erreur compréhensible pour l'utilisateur. Un petit test m'a montré qu'il s'agissait probablement d'une ParseException et une recherche dans le code a pointé l'endroit :-)

    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
     
     
    private static final SimpleDateFormat SUPPORTED_DATE_FORMATS[] = new SimpleDateFormat[] { 
    	new SimpleDateFormat("dd-MM-yyyy"), new SimpleDateFormat("dd/MM/yyyy"),
    	new SimpleDateFormat("dd.MM.yyyy"), new SimpleDateFormat("dd_MM_yyyy"),
    [...]
    };
     
    class MyCustomDateEditor extends PropertyEditorSupport {
     
      public void setAsText(String text) {
         if (!StringUtils.hasText(text)) setValue(null);
         else {
    	boolean parsed = false;
    	Exception anException = null;
     
    	for (int i = 0; !parsed && i < SUPPORTED_DATE_FORMATS.length; i++) {
    	try {
    	SUPPORTED_DATE_FORMATS[i].setLenient(false); // <- Ligne insérée pour résoudre le problème
               setValue(SUPPORTED_DATE_FORMATS[i].parse(text));
    	parsed = true;
    	} catch (ParseException ex) {anException = ex;}
    	}
     [...]
       }
    }
     
    protected void initBinder(RequestContext context, DataBinder binder) {
          // convert java.util.Date
          binder.registerCustomEditor(Date.class, new MyCustomDateEditor());
    }
    Apparement, la solution n'apporte pas d'effets de bords indésirables :-)

    Merci pour l'aide

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

Discussions similaires

  1. Problème de date dans requête de màj imbriquée
    Par VirginieGE dans le forum Langage SQL
    Réponses: 11
    Dernier message: 20/07/2004, 16h34
  2. problème de date
    Par baboune dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 10/06/2004, 11h52
  3. Problème de date dans MONTHS_BETWEEN
    Par ghostlord79 dans le forum Oracle
    Réponses: 10
    Dernier message: 07/04/2004, 12h21
  4. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 16h05
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 19h22

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