JAXB Unmarshall создал пустой объект
Я использую JAXB для развязывания XML файла в дереве объектов. Корневой объект не является нулевым, но все его члены являются нулевыми, хотя в файле XML есть данные. Мои классы объектов были созданы с помощью Axis2 из wsdls. Я имею класс ObjectFactory, класс jaxb.index, аннотацию package.info и т.д.
Моя проблема такая же, как и в этом обсуждении: http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html
В первую очередь: есть ли способ заставить его правильно заполнить данные?
Если нет, есть ли хорошая альтернативная библиотека для Axis2 или JAXB, которая делает то же самое, но которая будет хорошо сочетаться друг с другом?
Ответы
Ответ 1
JAXB по умолчанию игнорирует ошибки. Я не вижу никакой причины, почему это конфигурация по умолчанию. Попробуйте добавить этот код, чтобы вызвать исключение, если что-то пойдет не так.
unmarshaller.setEventHandler(
new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event ) {
throw new RuntimeException(event.getMessage(),
event.getLinkedException());
}
});
Ответ 2
Недавно у меня была аналогичная проблема, и я смог ее исправить следующим образом:
1) Исправить файл xsd.
В моем случае я обеспечил, чтобы все сложные элементы в xsd ссылались на их соответствующий тип, используя атрибут ref, вместо того, чтобы объявлять их с атрибутом типа.
Я проверял, действительно ли мой xsd или нет, создав файл xml из файла XML Schema в Eclipse.
До исправления корневой элемент в XML файле был пуст. После исправления xsd xml был правильно создан с некоторыми значениями образца.
2) очистить и перестроить
Обязательно очищать до повторного создания классов.
Ответ 3
Просто хочу добавить, что когда Axis2 используется вместе с Rampart (SOAP Body encryption) и JAXB, эта проблема возникает всегда.
Подробнее см. AXIS2-4981
Ответ 4
Файл package-info.java должен быть скомпилирован. Eclipse должен найти все .java файлы и скомпилировать их. Если компилировать из командной строки и разрешить поиск зависимостей javac, он НЕ найдет его. Затем, когда вы запустите, вы получите пустые объекты. Похоже на ошибку в JAXB, чтобы, по крайней мере, не импортировать этот файл. И ошибка должна сообщить вам о возможной компиляции этого файла.
Ответ 5
Я столкнулся с этой проблемой, когда файлы xsd, которые использовались для создания кода Java, имели ссылки на недостижимые URL-адреса.
К счастью, все эти ссылки появились в файлах package-info.java
поэтому мне пришлось добавить задачу antRun
после задачи xjc
которая их удалила.