JAXB unmarshall xml без package-info.java

JAXB unmarshaller выдает исключение, если нет файла package-info.java. Этот код вызывается с другого языка, и пользовательский загрузчик классов не может правильно загрузить информацию о пакете.

Я уже вручную добавил параметр namespace ко всем аннотациям @XmlElement.

Корневой элемент Xml имеет несколько атрибутов xmlns. Два из них (xmlns и xmlns:c) имеют одинаковое значение (я не могу изменить xml, исходящий от внешнего сервиса)

НО: это работает, если я удаляю xmlns="urn:foo:bar" из документа даже без информации о пакете

Вопрос: как я могу unmarshall без package-info (я не могу изменить пользовательский загрузчик классов, который не может его загрузить) и без удаления xmlns из xml? Что я должен изменить в своем коде?

Java 1.6_45 vJAXB 2.1.10

Пример корневого элемента XML:

<?xml-stylesheet type="text/xsl" href="file1.xslt">
<?xml-stylesheet type="text/xsl" href="file1.xslt"?>
<c:ClinicalDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="urn:foo:ba" xmlns:c="urn:foo:bar" xmlns:std="urn:foo:std"
 xsi:schemaLocation="urn:foo:bar file2.xsd">

Код:

String path = "D:\\data\\document.xml";

    try {
        JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
        Unmarshaller u = jc.createUnmarshaller();
        Object root = u.unmarshal(new File(path)); //exception w/o package-info.java

        CDocument doc= (CDocument) JAXBIntrospector.getValue(root);
        System.out.println(doc);

package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "urn:foo:bar", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(namespaceURI = "urn:foo:bar", prefix = "")})
package test.model;

    import javax.xml.bind.annotation.XmlNs;

Исключение:

javax.xml.bind.UnmarshalException: Unable to create an instance of my.package.here.model.ANY

Любые идеи будут с благодарностью, я потратил так много времени, но все еще ничего не имею.

1 ответ

Решение
BUT: It works if I remove xmlns="urn:foo:bar" from document even without package-info

Это означает, что вы не добавили namespace Параметр везде, где вам нужно.

В приведенном ниже XML-документе без @XmlSchema аннотации для сопоставления квалификации пространства имен, вам потребуется namespace параметр на @XmlRootElement аннотация для Foo класс и @XmlElement аннотация на bar имущество.

<foo xmlns="http://www.example.com">
    <bar>Hello World</bar>
</foo>
Другие вопросы по тегам