2017-10-12 18 views
0

Je veux marshall et unmarshall un xsd. J'ai un pot dire A.jar qui contient un fichier xsd dire 1.xsd. J'essaie de le valider en utilisant JAXB mais ça échoue. 1.xsd importe 3 schémas de plus qui sont présents dans différents jar (B. jar). Comment puis-je valider tel que lors de la validation, le 1.xsd pourrait lire les fichiers importés qui appartiennent à différents jar (B.jar).Comment lire le schéma XSD à partir d'un emplacement différent (Jar) pendant la validation

+0

"J'essaie de le valider en utilisant JAXB mais il échoue" - en quoi échoue-t-il, pouvez-vous donner des extraits de code ou des messages d'erreur? – gareththegeek

Répondre

0

En supposant que les deux jars sont disponibles sur le chemin de classe, il importe peu que les fichiers de schéma soient répartis sur différents bocaux ou non. Si un schéma importe ou inclut un autre schéma, l'important est que le chemin puisse être résolu. Supposons que vous ayez un paquet my.project.schemas qui existe dans A.jar et B.jar. Dans A.jar ce package contient 1.xsd, qui importe 2.xsd dans le même package dans B.jar. Si l'élément d'importation 1.xsd ressemble à ceci ...

<xs:import namespace="https://www.example.com" schemaLocation="2.xsd" /> 

alors il devrait fonctionner. Un résolveur prend soin de localiser l'autre schéma, et puisque le schemaLocation donné est relatif, le résolveur le trouvera parce qu'il considère le même paquet à travers différents fichiers jar comme le même emplacement.

Les choses peuvent devenir plus compliquées s'il y a différents paquets. Dans ce cas, vous devez utiliser un chemin relatif qui peut avoir besoin de monter ou descendre dans la hiérarchie du package pour faire référence au fichier correct (exemple: additional/2.xsd si le package additional est membre du package my.project.schemas). Une autre option est de use a custom resolver. Cela vous permet d'intercepter les appels de ressources externes et de les résoudre par programme.

Enfin, notez que le SchemaFactory utilisé pour créer un Schema objet has a method that accepts an array of sources. Si vous créez un Source pour chaque fichier de schéma et que vous les fournissez tous en usine pour créer un objet Schema, cela peut éviter les problèmes d'emplacement. En fait, vous pouvez simplement omettre l'attribut schemaLocation car les références nécessaires peuvent être trouvées parmi tous les schémas fournis. Dans le passé, j'ai utilisé JAXB avec des marshallers/unmarshallers de validation qui devaient utiliser des schémas de différents paquets en s'important, ce qui pouvait également se produire dans différents jars. La dernière solution, fournissant un Source par schéma à la méthode d'usine, était mon approche préférée.