El servicio web de Spring devuelve resultados diferentes cuando se utilizan objetos DOM de JAXB o XML

Tengo un objeto JAXB (ProductRequest) que representa un documento XML para una solicitud de servicio web. Supongamos que se parece a esto:

<ProductRequest>
<getProducts/>
</ProductRequests>

Para la respuesta, el objeto JAXB (ProductResponse) representará un documento XML como se muestra a continuación:

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

Usando Spring-WS, puedo enviar la solicitud al servicio web usando dos enfoques

Usando el objeto JAXB

ProductRequest productRequest = new productRequest();

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

Usando XML / DOM simple

DOMResult domresult = new DOMResult();

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

Cuando intento ambos enfoques, los resultados son diferentes. El primer enfoque que utiliza el objeto JAXB es el resultado

<?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>

El segundo enfoque que utiliza el objeto Dom XML es el resultado (incluye espacios de nombres)

<?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>

El encabezado del esquema utilizado para la respuesta en el servicio web se declara como:

<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>

Hay dos diferencias en la respuesta.

  • La primera línea en la respuesta de la solicitud JAXB incluye la entrada standalone = "yes">
  • Los elementos en la versión JAXB no tienen el prefijo con el espacio de nombres
  • ¿No debería la respuesta con elementos prefijados con el esquema haber usado "z" (como se define en el esquema) en lugar de ns2?

No entiendo qué podría estar causando esta diferencia dado que ambos están llamando al mismo servicio web que genera la respuesta basada en el mismo esquema. ¿Algunas ideas?

El contenido XML es el mismo, pero la diferencia en el formato del XML me está dando problemas ya que no puedo usar String.equals () para comparar los dos.

Respuesta 1

Las respuestas son las mismas, solo que no está calificado con un espacio de nombres.

En una nota al margen, su diseño XML se ve un poco escamoso. Podría ser mejor así;

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

¿Por qué? Porque no debes confiar en el orden de los elementos.

Respuesta: 2

Hola, estoy haciendo un programa Gui usando un diseño nulo y un método setBounds () para el diseño. En el programa quiero 25 cadenas impresas en la pantalla en ubicaciones aleatorias. Sé que podría hacer esto ...

Soy nuevo en Spring Boot y he estado intentando conectarlo a mi banco de trabajo MySql. Comencé un nuevo proyecto Spring Boot con web, jdbc, jpa e hibernate, pero me he quedado atascado. Hay un numero ...

Me gustaría saber si hay una manera de implementar un archivo .aar de Axis2 sin tener que incluirlo como parte de la aplicación web Axis 2. Sé que mi pregunta es corta, pero no hay mucho ...

Estoy tratando de configurar mi código Java para analizar si un elemento de mi matriz asistió a Disneyland o Universal Studios. Mi matriz tiene 7 elementos para 7 asistentes. Los asistentes reciben descuentos ...