Как отладить ошибку 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 во время маршалинга. (должен был подумать об этом первым)
Используя любой способ, я смог зарегистрировать данные и проверить, что вызывало сбой проверки достоверности вручную.