JAXB проблема с отсутствующим определением пространства имен
Поэтому я довольно долго искал решение этой конкретной проблемы и надеюсь, что кто-то может указать мне правильное направление.
Мы получаем данные в формате XML, и у нас есть только XSD для проверки данных. Поэтому я использовал JAXB для генерации классов Java. Когда я пошел демаршировать образец XML, я обнаружил, что некоторые значения атрибутов отсутствуют. Оказывается, что схема ожидает, что эти атрибуты будут QName, но поставщик данных не определил префикс в XML.
Например, одно значение атрибута XML "repository:<uuid>"
, но префикс пространства имен "хранилище" никогда не определяется в наборе данных. (Не берите в голову лучшие методы провайдера, предлагайте определить это!)
Поэтому, когда я отправил демонтировать набор образцов, атрибуты QName с указанным префиксом ("хранилище" в моем примере выше) были равны NULL! Таким образом, похоже, что JAXB "выбрасывает" те значения атрибута QName, которые имеют неопределенный префикс пространства имен. Я удивлен, что это не сохраняет даже местное название.
В идеале я хотел бы сохранить значение как есть, но похоже, что я не могу сопоставить QName со строкой во время привязки (схема к Java).
Я попытался "вручную" вставить определение пространства имен в XML, и это работает как шарм. Каков был бы наименее сложный способ сделать это?
Есть ли способ "вставить" отображение / определение пространства имен во время выполнения? Или определить это "глобально" во время привязки?
1 ответ
Простейшим было бы использовать строки вместо QName. Вы можете использовать javaType
настройка для достижения этой цели.
Если вы хотите добавить сопоставления префикса / пространства имен во время выполнения, есть довольно много способов сделать это:
- Как и выше, вы можете предоставить свой собственный конвертер QName, который будет учитывать ваши префиксы.
- Вы можете поместить фильтр SAX или StAX между ними и объявить дополнительные префиксы в
startDocument
, - Что вам действительно нужно, так это добавить ваши префиксные сопоставления в
UnmarshallingContext.environmentNamespaceContext
, Я проверил исходный код, но не смог найти прямой и простой способ сделать это.
Лично я бы внедрил фильтр SAX/StAX, чтобы "предварительно обработать" ваш XML на уровне событий.