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 :

Validation lors du marshaller avec JAXB2.0 [JAXB]


Sujet :

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

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Validation lors du marshaller avec JAXB2.0
    Bonjour,
    je viens de me mettre à JAXB (2.0) du coup je suis pas encore familier avec les différentes notions qu'il arbore, mais je vais essayer d'être clair.

    Je dois valider un message sous forme de texte en utilisant une XSD.
    Pour ce faire le message est d'abord transformé en modèle JAXB.
    Le modèle est validé en utilisant le marshaller préalablement configuré avec la XSD de validation.

    Le message texte peut contenir plusieurs erreurs et j'aimerai que le processus de "marshalling" ne stoppe pas à la première erreur.
    J'aimerai aussi récupérer la liste des erreurs et les "noeuds" impliqués.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try {
      ValidationEventCollector collector = new ValidationEventCollector();
      marshaller.setEventHandler(collector);
      marshaller.marshal(getXsdMessage(), new NullOutputStream());
    } catch (Exception e) {
       e.printStackTrace();
       collector.getEvents();
    }
    Ce code est juste destiné à faire quelques tests.
    marshaller est une instance de Marshaller crée via une autre classe j'ai fait simple dans cet exemple en supposant qu'il était déjà initialisé.

    En inspectant "collector" je ne trouve qu'une seule erreur et getNode retourne "null".
    Dans la liste des éléments du locator je vois bien le nom du noeud qui pose problème mais je ne sais pas comment le récupérer.

    Comment fait-on pour que le processus de marshalling ne stoppe pas lorsqu'il rencontre une erreur?
    Comment fait-on pour récupérer ces erreurs en utilisant le ValidationEventCollector ?

    D'avance merci

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Petite précision:
    J'accède au locator en récupérant les ValidationEvent du ValidationEventCollector. Le problème de l'élément en défaut c'est qu'il est bien accessible en tant qu' objet mais je ne veux pas faire un gros switch pour trouver à quel élément il appartient surtout que ces éléments sont générés à partir de ma XSD

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562
    Par défaut
    Comment fait on pour que le processus de marshaling ne stoppe pas lorsqu'il rencontre une erreur?
    Tu dois jeter un coup d'oeil dans l'appel de "marshalling" au lieu de faire
    new NullOutputStream()
    Marshalling to a SAX ContentHandler:

    // assume MyContentHandler instanceof ContentHandler
    marshaller.marshal( element, new MyContentHandler() );
    En plus tu peux generer la liste des elements ou se trouvent l'erreur avec ContentHandler

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'avais effectivement vu ce passage mais je n'avais pas compris l'utilité du Contenthandler .

    Merci bien je vais regarder et je posterai le résultat à mon post.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Alors en fait j'y suis arrivé d'une autre manière en définissant un "ValidationEventHandler".

    Il suffit d'implémenter la méthode "handleEvent" pour qu'elle retourne "true" et le processus ne s'arrête pas à la première erreur venue.

    Par contre j'ai regardé le contentHandler ainsi que plusieurs implémentation (XMLFilterImpl, defaultcontenthandler) pour essayer de comprendre comment récupérer la liste des objets qui ont conduit à une erreur mais j'avoue ne pas bien saisir où je peux faire celà.

    Si vous avez une piste à me fournir pour m'orienter ...

    Merci

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    534
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 534
    Points : 562
    Points
    562

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci bien j'ai réussit à faire ce que je voulais de 2 manières:
    - La moins "propre" en faisant un marshal puis un unmarshal de la même ressource avec un validationhandler. Le but etant que lors du unmarshal on peut accéder aux nodes problématiques.

    - Celle conseillée via le contenthandler.
    j'avais pas compris le fonctionnement de "startElement" et "endElement" qui se déclenchent au debut et à la fin du traitement de chaque élément XML.
    Donc qui permettent de récupérer l'élément courant.


    Voici la réponse à l'ensemble du problème (au cas où celà pourrai servir à quelqu'un). C'est juste un teste mais il affiche dans la console les infos recherchées.


    Les 2 handlers
    validation content handler permet de récupérer le nom de l'élément courant
    validation event handler permet de ne pas stopper le traitement lors de la vérification et de stocker les messages dans un collector
    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
    41
     
     
    class XmlValidationContentHandler extends DefaultHandler {
     
        Object node;
     
        @Override
        public void startElement(String aUri, String aLocalName, String aQName, Attributes aAttributes) throws SAXException {
          // TODO Auto-generated method stub
          super.startElement(aUri, aLocalName, aQName, aAttributes);
          node = aLocalName;
        }
     
        public Object getNode() {
          return node;
        }
      }
     
      class XmlValidationEventHandler implements ValidationEventHandler {
     
        ValidationEventCollector collector;
        XmlValidationContentHandler contentHandler;
     
        public XmlValidationEventHandler(ValidationEventCollector aCollector, XmlValidationContentHandler contentHandler) {
          super();
          collector = aCollector;
          this.contentHandler = contentHandler;
        }
     
        @Override
        public boolean handleEvent(ValidationEvent event) {
          System.out.println(event + " / " + contentHandler.getNode());
          collector.handleEvent(event);
          return true;
        }
     
        public ValidationEventCollector getValidationEventCollector() {
          return collector;
        }
     
      }
    Le code de validation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ValidationEventCollector eventCollector = new ValidationEventCollector();
        XmlValidationContentHandler contentHandler = new XmlValidationContentHandler();
        XmlValidationEventHandler validationEventHandler = new XmlValidationEventHandler(eventCollector, contentHandler);
     
    marshaller.setEventHandler(validationEventHandler);
    marshaller.marshal(body, contentHandler);
    Encore merci, problème [Résolu]

  8. #8
    Membre à l'essai
    Profil pro
    Dev
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Bonjour,
    J'ai un problème similaire mais du côté du Unmarshalling plutôt, est-il possible de valider le unmarshalling, en ayant le node qui peut avoir posé problème?
    D'avance merci,

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/11/2008, 01h16
  2. Erreur lors du marshalling d'une grappe d'objet avec Castor XML
    Par mbinte dans le forum Persistance des données
    Réponses: 2
    Dernier message: 29/08/2008, 17h07
  3. Valider un fichier XML avec un Schema
    Par Groove dans le forum Valider
    Réponses: 4
    Dernier message: 09/11/2005, 08h15
  4. Valider fichier XML : problème avec la DTD
    Par SkIllz2k dans le forum Valider
    Réponses: 2
    Dernier message: 26/04/2005, 17h15
  5. [SAX] ]Validation d'un Document avec une DTD
    Par laguiff dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 18/02/2004, 09h11

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