#java #xml #maven #jaxb #unmarshalling
#java #xml #maven #jaxb #отмена сопоставления
Вопрос:
Я отменяю сортировку некоторого XML в строку с помощью JAXB. Однако порядок атрибутов отличается от исходного XML при запуске наших сценариев сборки через Maven. Это приводит к сбою некоторых модульных тестов, которые отлично проходят в Eclipse.
Есть идеи, почему это может произойти? Здесь много похожих вопросов, но трудно найти надежный ответ. 🙂
Комментарии:
1. Ваши модульные тесты не должны проверять правильность упорядочения атрибутов.
2. Согласен. Тест просто проверяет большую строку, которая довольно грязная. Но я все еще не понимаю, почему на порядок влияет, если он выполняется в maven.
3. Я предполагаю, что вы используете другую версию Java, поэтому ваш Maven настроен неправильно. И тестирование в Eclipse использует внутренний компилятор Eclipse, который отличается от javac на консоли и, конечно, основан на том, что отличается в Maven, потому что Maven использует консольный javac.
4. Полезно знать. Похоже, я вернусь к чертежной доске по этому вопросу. Я отправлю ответ, когда у меня будут результаты, спасибо, ребята.
Ответ №1:
Порядок, в котором атрибуты отображаются в XML, не имеет значения, в то время как порядок, в котором встречаются элементы. JAXB, как и большинство технологий XML, не гарантирует порядок, в котором будут отображаться атрибуты. Ваши модульные тесты должны будут учитывать это.
Примечание
При использовании Unmarshaller
amp; Marshaller
выходной XML основан на метаданных сопоставления, а не на порядке входного XML. Метаданные позволяют указывать порядок элементов, но не атрибуты. Вы можете использовать JAXB Binder
для маршалирования в существующий документ (DOM).
Ответ №2:
Вы должны переписать свои модульные тесты, чтобы следовать правилам правильно сформированного XML, если они тестируют XML. Согласно спецификации XML, порядок атрибутов не важен, и вашему анализатору не нужно его применять. Это
<element one="1" two="2" />
это то же самое, что
<element two="2" one="1" />
Вы также должны знать о других различиях, которые считаются эквивалентными в правильно сформированных XML-документах, таких как пустые элементы. В соответствии со спецификацией XML:
<element></element>
это то же самое, что
<element/>
Ваш анализатор может выбрать использование одного или другого, и это не должно подводить ваши тесты, если они проверяют допустимый XML.
Ответ №3:
Небольшое обновление.
Итак, я немного лучше разобрался в ваших ответах и смог сравнить некоторые объекты jaxb в моем модульном тестировании. Но это заняло некоторое время.
Я обнаружил, что эта библиотека действительно помогла мне, и я пошел дальше:
Ответ №4:
Ваш модульный тест должен использовать Unmarshaller amp; Marshaller XML, чтобы ваш тест основывался на метаданных сопоставления, а не на порядке (или строке) входного XML.
Однако удобочитаемость для чтения человеком часто является приятной особенностью и позволяет вам «различать» выходные файлы, используя @XMLType(пропорциональный ….) вместо упорядочения атрибутов, что дает вам то, что вам нужно.
@XMLType(пропорциональный = { «elementone», «elementtwo», «attributeone», «attributetwo»
})