jaxb - как сопоставить файлы xsd с URL-адресом, чтобы найти их

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

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

спасибо, Дин


person Dean Hiller    schedule 20.03.2012    source источник


Ответы (2)


Есть несколько методов, которые вы можете использовать для решения проблемы:

Каталоги

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

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

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

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

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

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

См. это и это руководство. К сожалению, поддержка каталогов в 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.

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

person lexicore    schedule 21.03.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();

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

person bdoughan    schedule 20.03.2012
comment
Программное использование? Даже стандартный XJC поддерживает каталоги, нет необходимости в таком глубоком влиянии. - person lexicore; 21.03.2012
comment
@lexicore. Моим первым был XML-каталог (blog.bdoughan.com/2011/10/). Причина, по которой предлагается программный подход, заключается в том, что реальные схемы находятся в банках на пути к классам, и их расположение может быть не настроено с помощью каталога XML. - person bdoughan; 21.03.2012
comment
Извлечение JAR также является опцией. :) - person lexicore; 21.03.2012