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
Répondre
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.
"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