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

Struts 1 Java Discussion :

Problème de date [FAQ]


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut Problème de date
    Bonjour,

    G un table dans ma base de donnée qui contient un champ date: dateAlbum.
    g une classe ActionForm qui me permet d'aller rechercher tt les valeurs de cette table,et de les afficher dans un formulaire. Par exemple la méthode me permettant de recuperer la date au bon format et de l'afficher dans un champ de mon formulaire est :

    public void setDateAlbum(Date dateAlbum){
    this.dateAlbum = dateAlbum;
    }


    Jusqu'ici aucun problème. J'arrive à avoir tt mes valeurs afficher dans leurs champs respectifs.

    Ce formulaire me permet aussi d'effectuer des modifications sur les valeurs remontées. Malheureusement lorsque je valide une saisie, j'obtiens cette erreur :


    exception

    javax.servlet.ServletException: BeanUtils.populate
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:804)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


    cause mère

    java.lang.IllegalArgumentException: Cannot invoke fr.downtempo.AlbumForm.setDateAlbum - argument type mismatch
    org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
    org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
    org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
    org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
    org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
    org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:804)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


    Ma question est la suivante :

    Comment puis je avoir l'erreur Cannot invoke fr.downtempo.AlbumForm.setDateAlbum - argument type mismatch alors que la propriété dateAlbum de mon ActionForm est de type Date et que dans ma BDD le champ dateAlbum est aussi de type Date ?

    Pourrais je avoir une explication ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Laurent.B
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    3 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3 468
    Par défaut
    Il me semble que c'est une histoire de classe Date qui existe sous deux formes : java.sql.Date et java.util.Date ...
    Responsable FAQ Eclipse | Maintiens et développe un des logiciels destinés aux rédacteurs sur developpez.com
    Gardons toujours à l'esprit que le forum constitue une base documentaire, dont l'utilité et la qualité dépendent du soin apporté à nos questions et nos réponses. Soyons polis, précis (dans le titre et dans le corps des questions), concis, constructifs et faisons de notre mieux pour respecter la langue française et sa grammaire. Merci pour nous (les modérateurs) mais aussi et surtout, merci pour vous.
    Problème solutionné => je vais au bas de la page et je clique sur le bouton (qui suite à mise à jour du forum, a légèrement changé d'aspect).

  3. #3
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Bonjour,

    le mécanisme de BeanUtils va rechercher une méthode setDateAlbum(String dateAlbum) alors que tu as une méthode setDateAlbum(Date dateAlbum)

    En effet, tout ce que tu saisis dans ton formulaire, c'est finalement du texte et ce n'est pas typé.

    Eric

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Donc pour faire simple, je dois mettre tt les propriétés de mes classes ActionForm en type String et changer la signature de tt mes getter et setter pour kil prennent ou retourne un string ???

    Est ce que je dois faire pareil dans mes beans qui decrivent mes objets ?

    exemple : ma classe Action Form gère des Bean Album. g des propriétés de type int string date à l'interieur... la aussi j'enlève tt les types et je met du string ????????

    De plus, quand je vais insérer mes champs dans ma base, qui elle est typée, ça va pas poser des problèmes !?

    Y a un truk que je comprend pas la ...

  5. #5
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Du calme voyons.

    Pour les collections (y compris tableaux) ou agrégats, pas de problème puisque ce ne sont que des intermédiaires pour accéder à leurs propres attributs.

    Pour les attributs en général. Je dirais de par mon expérience que les types primitifs entiers et flottants sont pris en charge.

    Mais concernant la classe Date, il suffirait à priori d'écrire un setter avec l'autre signature et de convertir la String en Date

    Eric

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Oui c'est tout a fait ça, dans l'action qui précède ton form, tu transformes ta date en String (via DateFormat et le bon pattern). Cette String est ensuite "settée" dans ton formulaire...

    Le mécanisme est identique pour récupérer ton champs date à partir du formulaire soumis par l'utilisateur

    ++

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Bon alors voila,

    g rajouté un setter dans mon ActionForm Album pour permettre à BeanUtils de manipuler des string. Dans l'action qui me sert a effectuer la MAJ, g rajouté une fonction me permettant de parser la String en date. Voici cette fonction :

    public static Date StringToDate (String tmpDate) throws Exception{
    SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
    return sdf.parse(tmpDate);
    }


    Le format choisit ici est le format américain du format date de Mysql.
    Malheureusement voici se que je trouve dans les logs quand je fais un System.out.println sur la variable qui acceuille le résultat de cette fonction :

    Wed Jun 23 00:00:00 CET 6

    Puis je savoir pkoi mon format spécifié dans mon SimpleDateFormat n'est pas pris en compte ?

    DarkWark.

  8. #8
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Je tiens aussi a ajouter que ma variable recupérant la valeur envoyé par ma fonction est de type java.util.date et que si je modifie ce type par java.sql.date, g une erreur sur le return sdf.parse(tmpDate); :

    Type mismatch: cannot convert from Date to Date


  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Bon, pour résoudre une fois pour toute ce satané problème de struts et de date, voici ce que j'utilise pour ma part :

    Dans un premier temps, un Converter :

    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
    38
    39
    40
    package bla.bla.bla.utils;
     
    import java.text.ParseException;
    import java.util.Date;
     
    import org.apache.commons.beanutils.Converter;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
     
    public class DateConverter implements Converter {
     
    private static final Log logger = LogFactory.getLog(DateConverter.class);
     
        private Object defaultValue = null;
     
        public DateConverter() {
            this.defaultValue = null;
        }
     
        public DateConverter(Object defaultValue) {
            this.defaultValue = defaultValue;
        }
     
        public Object convert(Class type, Object value) {
            if (value == null) {
                return (defaultValue);
            }
     
            if (value instanceof Date) {
                return (value);
            }
     
            try {
                return WrapperUtil.toDate(value.toString());
            } catch (ParseException e) {
            	logger.debug("Unable to convert " + value + " into Date format.");
    			return defaultValue;
            }
        }
    }
    La classe WrapperUtil contiends une méthode statique assurant le formatage et le parsing selon un pattern configurable, j'utilise spring pour injecter le pattern en général...

    Une fois ce Converter écris et testé (sisi...) l'ajouté à la table des converters utilisés par les BeanUtils grace à un plug-in struts.



    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
    package bla.bla.bla.struts.plugin;
     
    import javax.servlet.ServletException;
     
    import org.apache.commons.beanutils.ConvertUtils;
    import org.apache.struts.action.ActionServlet;
    import org.apache.struts.action.PlugIn;
    import org.apache.struts.config.ModuleConfig;
     
    import bla.bla.bla.DateConverter;
     
    public class StrutsBootstrapPlugin implements PlugIn{
     
        public void destroy() {
        }
     
        public void init(ActionServlet actionServlet, ModuleConfig moduleConfig) throws ServletException {
            ConvertUtils.register(new DateConverter(), java.util.Date.class);
        }
     
    }
    Il ne reste plus qu'à ajouter ce plug-in au fichier de config de struts (struts-config.xml) avec la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <plug-in className="bla.bla.bla.struts.plugin.StrutsBootstrapPlugin" />
    Voilà, il n'en faut pas plus pour que Struts sache convertir définitivement de lui- même les String en Date lors de la population des formBean

    A ajouter à la faq si possible

  10. #10
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    D'ou vient ton WrapperUtil.toDate et ton logger.debug ? N'y a t'il pas une initialisation a faire ouo une instanciation ?

  12. #12
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Citation Envoyé par Alwin
    La classe WrapperUtil contiends une méthode statique assurant le formatage et le parsing selon un pattern configurable, j'utilise spring pour injecter le pattern en général...
    C'est à toi de l'écrire

    Le logger et défini par private static final Log logger = LogFactory.getLog(DateConverter.class);

  13. #13
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Mais je dois pas utiliser Spring quand meme ? Je n'ai qu'a créer une methode toDate dans une class WrapperUtil comme dans l'exemple que je citais plus haut :

    public static Date StringToDate (String tmpDate) throws Exception{
    SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
    return sdf.parse(tmpDate);
    }
    On est daccord ou c plus compliké que ça ?

  14. #14
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Pourrais je avoir un complément d'information ...

  15. #15
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Bon voici se que j'ai mis dans ma classe dateConverter :

    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
    public Object convert(Class type, Object value) {
     
        	Date laDate = new Date();
     
            if (value == null) {
                return (defaultValue);
            }
     
            if (value instanceof Date) {
                return (value);
            }
     
            try {
            	SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
            	laDate = sdf.parse(value.toString());
                return laDate;
     
            } catch (ParseException e) {
            	logger.debug("Unable to convert " + value + " into Date format.");
    			return defaultValue;
            }
        }
    et cette classe je l'appel à partir de mon action qui va inserer les données en base avec cette methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static Date StringToDate (String tmpDate) throws Exception{
    		DateConverter DateConverteur = new DateConverter (tmpDate);
    		Date laDate = new Date();
    		laDate = (Date)(DateConverteur.convert(Date.class,tmpDate));
     
    		return laDate;
    	}
    Malheureusement je retrouve exactement le même résultat qu'avant au niveau du format de ma date :

    DATE DANS EDITACTION : Tue Jun 29 00:00:00 CET 6

    Pourriez vous me donner des infos sur cette classe WrapperUtil ?

    Merci pour vos réponses.

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Pour la première partie, pas de souci

    Par contre, tu n'as rien à faire dans ta classe d'action ! RIEN DU TOUT !
    Tu dois simplement faire un formBean avec un objet typé java.util.Date.

  17. #17
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    Mais au debut de mon post vous aviez dit de tt mettre en String ! Je suis un peu perdu la ! kelkun peut me faire un resumé ?

  18. #18
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Je n'ais pas dis ça non
    ça fonctionne avec des java.util.Date et mon converter ?

  19. #19
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 163
    Par défaut
    En changeant le type de ma date dans mon form et dans mon bean de String a date et en laissant ton converter, g une erreur 404 a l'entrée de mon application (la page d'acceuil, qui n'est pas la page sur laquel j'effectue mes modification )pour le moment

  20. #20
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Citation Envoyé par DarkWark
    En changeant le type de ma date dans mon form et dans mon bean de String a date et en laissant ton converter, g une erreur 404 a l'entrée de mon application (la page d'acceuil, qui n'est pas la page sur laquel j'effectue mes modification )pour le moment
    Erreur 404 n'as rien à voir avec notre histoire !
    Soit tu invoque une mauvaise page, soit tu forward vers une mauvaise page

Discussions similaires

  1. [XL-2007] Probl formule avec des intervales de dates
    Par alexandrek dans le forum Excel
    Réponses: 0
    Dernier message: 09/02/2011, 11h56
  2. probl champ date
    Par bambino13 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/07/2009, 14h28
  3. Probl insertion date dans db mysql(odbc)
    Par MetalGearBe dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/03/2007, 16h54
  4. proble de recuperation de date
    Par mikaloop dans le forum Access
    Réponses: 8
    Dernier message: 24/02/2006, 23h01
  5. Réponses: 3
    Dernier message: 19/04/2002, 00h11

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