jaxb - как сопоставить файлы xsd с URL, чтобы найти их - PullRequest
4 голосов
/ 20 марта 2012

У меня есть xsd, в котором есть типичные операторы import для импорта других файлов xsd, но, к сожалению, ссылки представляют собой жестко закодированные пути. Есть ли способ в JAXB переопределить расположение этих импортов, используя файл xbj?

Все эти xsds доставляются через другой jar-файл (внутри jar-файла), поэтому я хотел бы получить один из пути к классам, и когда он импортирует, другие пытаются настроить его так, чтобы другие вытесняли из пути к классам.

спасибо, Декан

Ответы [ 2 ]

9 голосов
/ 21 марта 2012

Существует несколько методов, которые можно использовать для решения этой проблемы:

Каталоги

Вы можете использовать файл каталога для переопределения расположения схемы.Вот пара примеров:

Использование другой схемы в зависимости от пространства имен:

PUBLIC "http://example.org/A" "others/schema_a.xsd"

Использование другой схемы в зависимости от расположения схемы:

REWRITE_SYSTEM "https://example.org/a.xsd" "others/schema_a.xsd"

Позволяет вамиспользуйте локальную копию файла схемы.

См. this и this руководств.К сожалению, поддержка каталогов в XJC не всегда работает должным образом, и отладку немного сложно.

Разрешение схем из артефактов Maven

Если вы используете Maven, вы можете использовать maven-jaxb2-plugin, который может разрешать схемы в артефактах Maven:

REWRITE_SYSTEM "https://example.org/a.xsd" "maven:org.example:a!/a.xsd"

В сочетании с каталогами вы можете заставить JAXB использовать a.xsd внутри a-XXX.jar вместо https://example.org/a.xsd.

См. Примеры проектов:

1 голос
/ 20 марта 2012

Вы можете попробовать взаимодействовать с XJC программно (см. Ниже) и подключить свой собственный EntityResolver для разрешения схем XML:

import com.sun.codemodel.*;
import com.sun.tools.xjc.*;
import com.sun.tools.xjc.api.*;

SchemaCompiler sc = XJC.createSchemaCompiler();
sc.setEntityResolver(new YourEntityResolver());
sc.setErrorListener(new YourErrorListener());
sc.parseSchema(SYSTEM_ID, element);
S2JJAXBModel model = sc.bind();

Ниже приведена ссылка на соответствующий ответ, который я дал, что некоторые люди сочли полезным:

...