2012-01-05 10 views
13

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

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

Спасибо за понимание!

Эрик

ответ

7

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

+0

Спасибо за ссылку. Никогда не пробовал это раньше; даст ему шанс. Но, учитывая, что я создал классы JAXB из XSD, кажется, что он идет назад. Но я до сих пор не считаю это элегантным решением. JAXB действует как полный черный ящик, и без каких-либо индикаторов, объясняющих, что он делает, я понятия не имею, почему-то, почему он терпит неудачу. Я хотел бы найти метод, позволяющий мне «видеть», что он делает, и/или где проблемы лежат. –

+0

Спасибо за предложение. Я пробовал использовать валидатор, и он бросает ошибку, которую я не понимаю. Для этого я создал отдельную нить (http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme). Если вы можете что-то предложить, я был бы очень признателен. Благодарю. –

+0

Действительно, это лучший подход, который я нашел до сих пор, потому что [другие подходы] (http://stackoverflow.com/a/10227684/1864054) просто не дают хороших и/или продуктивных результатов. Однако я бы рекомендовал не использовать 'soapUI' для генерации тестовых сообщений, поскольку он генерирует скелет сообщения без каких-либо (поддельных) значений данных, заставляя вас вручную вводить все, что подвержено ошибкам, особенно для больших сообщений. Вместо этого XMLSpy Altova творит чудеса. Все, что вам нужно сделать, это выбрать пункт «Создать новый запрос SOAP» из меню «SOAP» и, voila !, у вас получилось отлично работающее (поддельное) сообщение. – Withheld

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

Комментарий или два о том, как этот фрагмент кода отвечает на вопрос быть полезным. DefaultValidationEventHandler - это старый обработчик JAXB 1.0 - правильно? Вы предлагаете это как ответ, потому что старый обработчик выплевывает более подробные сообщения об ошибках? – Ryan

+0

Из Javadocs: общественный класс DefaultValidationEventHandler расширяет объект реализует ValidationEventHandler JAXB 1.0 только по умолчанию обработчик события проверки. Это обработчик по умолчанию для всех объектов, созданных из JAXBContext, который управляет кодом кода, сгенерированным компилятором JAXB 1.0. Этот обработчик приводит к сбою операций немаршаля и подтверждения при первой ошибке или фатальной ошибке. – superbAfterSemperPhi

Смежные вопросы