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

Format d'échange (XML, JSON...) Java Discussion :

xs:date + XMLGregorianCalendar [JAXB]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Par défaut xs:date + XMLGregorianCalendar
    Bonjour,

    Dans le cadre d'un migration vers un fichier XML (basé sur un XSD qui ne peut pas être modifié), je rencontre un problème avec un élement xml "xs:date".

    En utilisant JAXB, le champ java est défini comme un "XMLGregorianCalendar" sous le format : "2013-10-18T09:26:30.952+02:00".

    Or le fichier xml n'est pas validé car l'élement "xs:date" doit être de la forme "yyyy-MM-dd" => "2013-10-18".

    Comment faire pour convertir une date en utilisant "XMLGregorianCalendar" sous le format "yyyy-MM-dd".

    Merci

  2. #2
    Membre confirmé Avatar de Dark-Water
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 142
    Par défaut
    Pour ma part j'ai rajouté ces deux annotations sur le bean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @XmlSchemaType(name = "date")
    @XmlJavaTypeAdapter(value=XmlDateFormatter.class)
    et defini la classe XmlDateFormatter comme suit.


    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
     
    public class XmlDateFormatter extends XmlAdapter<String	, Date>{
     
        private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
     
        @Override
        public String marshal(Date v) throws Exception {
            return dateFormat.format(v);
        }
     
        @Override
        public Date unmarshal(String v) throws Exception {
            return dateFormat.parse(v);
        }
     
    }
    Il me semble que les annotations peuvent être généré à partir de la xsd, mais je me rappelle plus comment.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Par défaut
    ce qui m'ennuie avec ta solution, c'est le fait de devoir changer la classe générée par l'XSD.

    Mon idée serait plutôt d'avoir une méthode (input : int - string - date, output : XMLGregorianCalendar) qui me permettrait de faire la conversion sans modification dans la classe générée ni dans l'XSD ...

  4. #4
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    La solution plus intégrée et recommendée est d'utiliser une adaptation ("customisation") par un fichier externe (ou de modifier le schéma 'inline' pour achever le même effet qui est faisable aussi, bien entendu). A défaut de méthodes qui sont appelées durant 'marshalling' et 'unmarshalling' dans certains cas, il vous faut, en plus, les construire vous-même via une classe d'adaptation d'habitude.

    On peut consulter ces pages de documentation.
    https://jaxb.java.net/guide/
    https://jaxb.java.net/guide/Using_di...datatypes.html

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Par défaut
    Pour ceux qui chercheraient une solution, j'en ai trouvé une (peut-être pas la plus optimale mais elle fonctionne) :

    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
    public XMLGregorianCalendar conversion_int_date(int convDate) {
    		try
    		{
    			if(convDate >= 0 && convDate <= 999999) {
    				DatatypeFactory dtf = DatatypeFactory.newInstance();
    				Date convertedDate = null;
    				DateFormat formatter = new SimpleDateFormat("ddMMyy");
    			    DecimalFormat decimalFormat = new DecimalFormat("000000");
    			    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
     
    		        String ddMMyy = decimalFormat.format(convDate);
    		        convertedDate = (Date) formatter.parse(ddMMyy);
    		        String date = sdf.format(convertedDate);
    		        convertedDate = sdf.parse(date);
     
    				GregorianCalendar cal=(GregorianCalendar) Calendar.getInstance();
    				cal.setTime(convertedDate);
    				XMLGregorianCalendar value = dtf.newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DATE), cal.getTimeZone().getRawOffset()/60000);
    				return value;
    			} else {
    				log.error("Error : the date is not valid (" + convDate + ") !");
    			}
    		}
    		catch (DatatypeConfigurationException e)
    		{
    			log.error("Error Datatype Configuration : " + e.getMessage());
    		} catch (ParseException e) {
    			log.error("Error conversion Date (ParseException) : " + e.getMessage());
    		}
    		return null;
    }

  6. #6
    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
    Bonjour,

    La solution la plus intelligente est sans doute d'influer sur le comportement de XJC, en lui précisant un fichier de binding et en ajoutant une classe DateAdapter de ton cru, à tes sources.

    Comme indiqué par tsuji, tout est là : https://jaxb.java.net/guide/Using_di...datatypes.html
    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).

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

Discussions similaires

  1. XMLGregorianCalendar -> date
    Par livinho38 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 04/01/2011, 21h46
  2. Réponses: 0
    Dernier message: 18/05/2009, 17h31
  3. [JDOM] XMLGregorianCalendar et type xs:date
    Par BakaOnigiri dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 28/01/2009, 16h10
  4. Cast Date-> XMLGregorianCalendar
    Par crakos dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 25/07/2007, 14h11
  5. Réponses: 1
    Dernier message: 25/05/2007, 14h28

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