2017-10-12 5 views
0

xsdをマーシャリングしアンマーシャルしたいと思っています。私は1つのxsdファイルが含まれているA.jarと言っている瓶を持っている1.xsdを言う。 JAXBを使用して検証しようとしていますが、失敗します。 1.xsdは、異なるjar(B. jar)に存在する3つのスキーマをインポートしています。 1.xsdがそれを検証している間に、異なるjar(B.jar)に属するインポートされたファイルを読み取ることができるように検証する方法を教えてください。検証中に別の場所(Jar)からXSDスキーマを読み取る方法

+0

"JAXBを使用して検証しようとしていますが、失敗します" - どのように失敗するのですか、関連するコードスニペットやエラーメッセージを表示できますか? – gareththegeek

答えて

0

両方のjarがクラスパス上で利用可能であると仮定すると、スキーマファイルが異なるjarに分散されているかどうかはそれほど重要ではありません。 1つのスキーマが別のスキーマをインポートまたは含む場合、重要なことはパスを解決できることです。

A.jarB.jarに存在するmy.project.schemasというパッケージがあるとします。 A.jarのパッケージには、1.xsdが含まれています。これは、B.jarの同じパッケージに2.xsdをインポートします。 1.xsdでimport要素は次のようになります場合は...

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

それが動作するはずです。リゾルバは他のスキーマの位置を管理し、指定されたschemaLocationは相対パスであるため、リゾルバは同じパッケージが異なる場所に存在するとみなします。

パッケージが異なると状況がさらに複雑になることがあります。その場合、適切なファイルを参照するためにパッケージ階層を上または下に移動する必要のある相対パスを使用する必要があります(例:がmy.project.schemasのメンバーである場合はadditional/2.xsd)。別のオプションはuse a custom resolverです。これにより、外部リソースの呼び出しをインターセプトしてプログラムで解決することができます。

最後に、Schemaオブジェクトhas a method that accepts an array of sourcesの作成に使用されるSchemaFactoryに注意してください。スキーマファイルごとにSourceを作成し、すべてをSchemaオブジェクトを作成するために工場に提供すると、場所の問題を回避できます。実際には、schemaLocation属性を省略することができます。これは、指定されたすべてのスキーマで必要な参照が見つかる可能性があるためです。

以前は、JAXBを使用して、異なるパッケージ間でスキーマを使用しなければならなかったマーシャラー/アンマーシャラーを検証しました。これは、さまざまなjarにまたがっている可能性があります。ファクトリメソッドにスキーマごとにSourceを提供する最後の解決策が、私の好ましいアプローチでした。

関連する問題