Веб-служба Spring возвращает разные результаты при использовании объектов JAXB или XML DOM

У меня есть объект JAXB (ProductRequest), который представляет XML-документ для запроса веб-службы. Предположим, что это выглядит примерно так:

<ProductRequest>
<getProducts/>
</ProductRequests>

Для ответа объект JAXB (ProductResponse) будет представлять XML-документ, как показано ниже:

<ProductResponse>
 <productId>1</productId>
 <productName>Oranges</productName>
 <productId>2</productId>
 <productName>Apples</productName>
</ProductResponse>

Используя Spring-WS, я могу отправить веб-службе запрос, используя два подхода.

Использование объекта JAXB

ProductRequest productRequest = new productRequest();

ProductResponse productResponse = (ProductResponse) webServiceTemplate
                .marshalSendAndReceive(productRequest);

Использование простого XML/DOM

DOMResult domresult = new DOMResult();

webServiceTemplate.sendSourceAndReceiveToResult(source, domresult);  //source represents the XML document as a DOMSource object
Element responseElement = (Element) domresult.getNode().getFirstChild();

Когда я пробую оба подхода, результаты разные. Первый подход с использованием объекта JAXB результат

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProductResponse xmlns="http://mySchema">
 <productId>1</productId>
 <productName>Oranges</productName>
 <productId>2</productId>
 <productName>Apples</productName>
</ProductResponse>

Результат второго подхода с использованием объекта XML Dom (включая пространства имен)

<?xml version="1.0" encoding="UTF-8"?>                 
<ns2:ProductResponse xmlns:ns2="http://mySchema">
 <ns2:productId>1</ns2:productId>
 <ns2:productName>Oranges</ns2:productName>
 <ns2:productId>2</ns2:productId>
 <ns2:productName>Apples</ns2:productName>
</ns2:ProductResponse>

Заголовок схемы, используемой для ответа веб-службы, объявляется как:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:z="http://mySchema" 
  targetNamespace="http://mySchema" 
  elementFormDefault="qualified" 
  attributeFormDefault="unqualified">

    -- Schema elements

</xs:schema>

Есть два отличия в ответе

  • Первая строка ответа на запрос JAXB включает запись standalone="yes">
  • Элементы в версии JAXB не имеют префикса пространства имен.
  • Разве ответ с элементами с префиксом схемы не должен использовать «z» (как определено в схеме) вместо ns2?

Я не понимаю, что может быть причиной этой разницы, учитывая, что они оба вызывают одну и ту же веб-службу, которая генерирует ответ на основе одной и той же схемы. Любые идеи?

Содержимое XML такое же, но разница в формате XML вызывает у меня проблемы, поскольку я не могу использовать String.equals() для сравнения двух.


person ziggy    schedule 15.06.2012    source источник


Ответы (2)


Ответы одинаковые, только этот не определяется пространством имен.

С другой стороны, ваш XML-дизайн выглядит немного ненадежным. Может быть, так лучше;

<ProductResponse>
  <product>
    <id>1</id>
    <name>Oranges</name>
  </product>
  <product>
    <id>2</id>
    <name>Apples</name>
  </product>
</ProductResponse>

Почему? Потому что вы не должны полагаться на порядок элементов.

person Qwerky    schedule 15.06.2012
comment
Да, именно так оформляется настоящий документ. Вышеупомянутое было просто примером. - person ziggy; 15.06.2012

Результат тот же. ns2 — это просто префикс для пространства имен, jaxb использует пространство имен по умолчанию, а XML Dom использует префикс ns2. Файлы xml эквивалентны, и оба они допустимы для этой схемы. Подробнее о пространстве имен XML можно прочитать здесь.

person tibtof    schedule 15.06.2012
comment
Есть ли способ, которым я могу заставить оба быть квалифицированными с пространством имен или не квалифицированными? - person ziggy; 15.06.2012