21 votes

JAXB Unmarshall a créé un objet vide

J'utilise JAXB pour décomposer un fichier XML en un arbre d'objets. L'objet racine est non nul, mais tous ses membres sont nuls bien que le fichier XML contienne des données. Mes classes d'objets ont été générées avec Axis2 à partir de wsdls. J'ai la classe ObjectFactory, la classe jaxb.index, l'annotation package.info, etc.

Mon problème est le même que celui de cette discussion : http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html

Tout d'abord, y a-t-il un moyen de faire en sorte que les données soient correctement remplies ?

Si ce n'est pas le cas, existe-t-il une bonne bibliothèque de substitution pour Axis2 ou JAXB qui fasse la même chose mais qui fonctionne bien avec les autres ?

59voto

Jesse Barnum Points 2437

Par défaut, JAXB ignore les erreurs. Je ne vois pas pourquoi il s'agit de la configuration par défaut. Essayez d'ajouter ce code pour lancer une exception si quelque chose ne va pas.

unmarshaller.setEventHandler(
    new ValidationEventHandler() {
        @Override
        public boolean handleEvent(ValidationEvent event ) {
            throw new RuntimeException(event.getMessage(),
                                       event.getLinkedException());
        }
});

1voto

Srinivas Points 11

J'ai récemment eu un problème similaire et j'ai pu le résoudre comme suit :

1) Correction du fichier xsd. Dans mon cas, j'ai veillé à ce que tous les éléments complexes du fichier xsd fassent référence à leur type correspondant à l'aide de l'attribut ref, au lieu de les déclarer avec l'attribut type.

J'ai vérifié si mon xsd était correct ou non en créant un fichier xml à partir de l'option XML Schema file dans Eclipse.

Avant la correction, l'élément Root du fichier xml était vide. Après avoir corrigé le xsd, le xml a été créé correctement avec quelques valeurs d'exemple.

2) nettoyer et reconstruire Il est obligatoire de nettoyer avant de re-générer les classes.

0voto

rustyx Points 2722

Je voudrais juste ajouter que lorsque Axis2 est utilisé avec Rampart (SOAP Body encryption) et JAXB, ce problème se produit toujours.

Voir les détails : AXIS2-4981

0voto

Jeff Points 9

Le fichier package-info.java doit être compilé. Eclipse doit trouver tous les fichiers .java et les compiler. Si vous compilez à partir de la ligne de commande et que vous laissez javac rechercher les dépendances, il ne les trouvera PAS. Lors de l'exécution, vous obtiendrez des objets vides. Cela ressemble à un bogue dans JAXB de ne pas au moins importer ce fichier quelque part. Et l'erreur devrait vous indiquer qu'il est possible de compiler ce fichier.

0voto

OldCurmudgeon Points 16615

J'ai rencontré ce problème lorsque les fichiers xsd utilisés pour créer le code Java contenaient des références à des adresses URL inaccessibles.

Heureusement, toutes ces références figuraient dans le package-info.java J'ai donc dû ajouter un fichier antRun après la tâche xjc qui les a supprimées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X