Как отладить ошибку JAXB Marshaling из-за нарушений идентификационных данных

Я пытаюсь записать дерево объектов Java в XML с помощью JAXB Marshaling. Вызов API-интерфейса маршала завершается ошибкой со следующей ошибкой в ​​журналах:

javax.xml.bind.MarshalException
 - with linked exception:
[org.xml.sax.SAXParseException; lineNumber: 0; columnNumber: 0; Duplicate unique value [ar-AE] declared for identity constraint of element "source-language".]
 at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311)

Я понимаю, что в объектах есть некоторые данные, которые нарушают ограничение уникального значения. Объекты Java были сгенерированы из файла XSD, который включает указанное ограничение.

Мне нужен какой-то способ просмотреть данные в дереве объектов и определить дубликаты значений, чтобы их можно было найти в источнике данных.

Есть ли какой-нибудь простой способ получить вывод данных объектов Java в строку или файл журнала?

Объекты Java были сгенерированы из схемы XSD и не содержат разумного метода toString, который я мог бы вызвать для корневого объекта дерева и получить дамп всех данных. Мне нужно написать собственный код, чтобы перебрать все объекты в дереве и распечатать соответствующие поля.

В идеале я надеюсь, что в JAXB найдется способ временно игнорировать проверку ограничений и просто сгенерировать XML для дерева объектов.

1 ответ

Я нашел пару способов решить эту проблему

Одним из способов является добавление методов toString. Методы toString не создаются по умолчанию для классов Java, созданных из файлов XSD. Но их можно добавить с помощью проекта плагинов JAXB basics. Смотрите этот проект - https://github.com/highsource/jaxb2-basics

Другой - просто переключать валидацию XSD во время маршалинга. (должен был подумать об этом первым)

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

Другие вопросы по тегам