Подтвердить что ты не робот

Как отладить JAXB unmarshalling?

У меня проблема с JAXB unmarshalling. Я думаю, что он правильно закодирован, но мой объект unmarshalled возвращается с нулевыми параметрами. Следовательно, я предполагаю, что при unmarshalling JAXB не видит соответствующую структуру XML, которую он ожидает. Однако я не получаю никаких сообщений об ошибках или каких-либо исключений.

Нужно ли вообще пройти процесс unmarshalling, чтобы точно увидеть, где/почему он не заполняет мои объекты?

Фактический код unmarshalling довольно мирский:

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException {
    // Creating an unmarshaller
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller();

    // unmarshal an instance node into  Java content
    return clazz.cast(u.unmarshal(node, clazz).getValue());
}

Однако, когда я его вызываю, я получаю объект типа clazz, возвращенный (как и ожидалось), но не загруженный.

Объект DOM, который я пытаюсь развязать, генерируется сторонним API. Я уже сталкивался с некоторыми необычными поведением с помощью unmarshalling, поэтому я хотел бы иметь возможность отлаживать процесс. Например, если я попытаюсь развязать подэлемент внутри объекта DOM (то есть: doc.getByElementName( "myElement" ). Item (0)), он терпит неудачу. Однако, если я конвертирую документ в строку и reimport в новый документ, он преобразует его в тонкий.

Я начинаю разочаровываться, не зная, как отладить эту проблему.

Спасибо за любые идеи!

Эрик

4b9b3361

Ответ 1

Один из подходов, который вы можете предпринять, - использовать JAXB для создания XML-схемы из ваших аннотированных классов. Это означает, что JAXB ожидает, что исходный документ будет выглядеть. Затем проверьте свой XML-документ на эту схему XML, чтобы убедиться, что он соответствует ожиданиям JAXB.

Ответ 2

JAXBContext context = JAXBContext.newInstance(jaxbObjectClass);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());