Пролетната уеб услуга връща различни резултати при използване на 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