У меня есть 3 файла xsd, которые зависят друг от друга, чтобы создавать определения моих элементов. Каждый xsd-файл имеет собственное пространство имен. Когда я создаю свои классы с помощью JAXB xjc, я получаю 3 соответствующих пакета. Все идет нормально.Как управлять упорядочением/последовательностью генерации схемы памяти в JAXB?
Моя проблема возникает, когда я хочу сделать проверку схемы с помощью unmarshaller. Чтобы избежать чтения в xsd-файлах, я генерирую схемы «на лету» из класса, о котором идет речь, будучи немаршарированным. Однако, поскольку класс зависит от объектов из 2 других пакетов, он не может сгенерировать схемы, если я не укажу все 3 пакета. Это уже не очень практическое решение, так как оно требует от меня знать дерево иерархии объектов/дерева зависимостей и соответственно указать список пакетов.
Моя большая проблема возникает, когда я пытаюсь создать новую схему из 3 сгенерированных схем, используя SchemaFactory (SchemaFactory.newSchema (Source [])). По-видимому, порядок, в котором схемы предоставляются на фабрике схемы, имеет решающее значение для разрешения зависимостей. Если первая схема в массиве зависит от определения типа от последнего элемента в массиве, я получаю ошибку постановляет:
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'ns1:InCalculationDataType' to a(n) 'type definition' component.
Если я изменить порядок и поставить 3-ю схему первой, она преуспевает без ошибок ,
Это делает практически невозможным создание метода достаточно общего, но, скорее, необходимо кодировать для каждого случая XSD индивидуально.
Есть ли что-нибудь, что я могу сделать для облегчения этой проблемы? Есть ли способ заставить SchemaFactory сначала прочитать все, а затем сгенерировать его ошибки, если он найдет какие-либо? Я знаю, что вы можете создать ErrorHandler, однако JavaDocs указывают, что если он выдает Fatal-ошибку, любая дальнейшая обработка ненадежна.
EDIT
Просто для моего собственного спокойствия, я попытался создать обработчик ошибок, который игнорировал не фатальные ошибки (только зарегистрированным их), однако генерируемый схема была ненадежной и не удалось должным образом проверить xml ошибки. Следовательно, это не имело значения для меня.
END EDIT
Любые предложения или мысли будут оценены.
Спасибо!
Эрик
Я помню, в моем опыте у меня был случай, когда порядок схем в 'SchemaFactory.newSchema()' сделал дело. И если правильно помнить, это было именно то, что вы получили: когда схема была в зависимости от другой. Но если вы хотите генерировать схемы «на лету», вы знаете зависимость между ними? –
Да, я знаю их зависимости, но учитывая, что есть несколько разных xsds, которые я хочу генерировать «на лету», я надеялся использовать общий фрагмент кода, который создавал JAXBContext из требуемого класса/pkg и генерировал схему исходя из его потребностей. Однако, если мне нужно закодировать зависимости вручную, то каждое поколение XSD должно быть закодировано независимо, что несколько уродливое решение, учитывая, что у меня есть несколько таких XSD/объектов для генерации. –