Tengo un servicio web de terceros para el que genero un cliente usando wsimport. Cada llamada al servicio web se completa con éxito, pero el objeto de respuesta que recibo tiene todos sus campos establecidos en nulo. Monitoreo de la red Puedo ver que en el cable todos los elementos XML en el mensaje de respuesta tienen valores en ellos, por lo que el objeto debe tener datos no nulos en él. Además, un cliente para el mismo servicio generado con old axis1 y llamado con los mismos datos devuelve una respuesta no vacía. ¿Alguna idea de lo que está pasando? (En caso de que haya alguna diferencia, estoy usando la implementación de MOXy de JAXB).Mi cliente de servicio web jax-ws solo devuelve objetos vacíos
Actualización: He podido reducirlo. El wsdl define el objeto en su propio espacio de nombres, digamos http://www.acme.com/ws
. La respuesta que recibo de servicio es
<?xml version="1.0" encoding="UTF-8"?>
... SOAP envelope ...
<ns1:opINFOWLResponse xmlns:ns1="http://www.acme.com/ws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:responseINFOWL xsi:type="ns1:responseINFOWL">
<result>6003</result>
<ndserr/>
<transid>61437594</transid>
<descriptionerr>BLAH.</descriptionerr>
</ns1:responseINFOWL>
</ns1:opINFOWLResponse>
... SOAP closing tags ...
y es unmarshalled a un no nulo OpINFOWLResponse
que se envuelve alrededor de un objeto no nulo responseINFOWL
con todos los campos establecidos en null. Sólo por diversión He intentado escribir un par de líneas para deserializar el fragmento anterior (después de quitar la sobrecarga de SOAP)
JAXBContext ctx = JAXBContext.newInstance(OpINFOWLResponse.class);
Unmarshaller u = ctx.createUnmarshaller();
OpINFOWLResponse o = (OpINFOWLResponse) u.unmarshal(new StringReader(theSnippetAbove));
ResponseINFOWL w = o.getResponseINFOWL();
y obtener el mismo resultado. Si cambio el XML anterior a
<?xml version="1.0" encoding="UTF-8"?>
<ns1:opINFOWLResponse xmlns:ns1="http://www.acme.com/ws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:responseINFOWL xsi:type="ns1:responseINFOWL">
<ns1:result>6003</ns1:result>
<ns1:ndserr/>
<ns1:transid>61437594</ns1:transid>
<ns1:descriptionerr>BLAH.</ns1:descriptionerr>
</ns1:responseINFOWL>
</ns1:opINFOWLResponse>
Todo funciona bien. Gorrón.
actualización (de nuevo): El mismo comportamiento tanto con jaxb-RI y Moxy. Todavía no tengo idea de lo que está mal.
Update (Sep. de 9): La sugerencia por debajo de la calificación de espacio de nombres a equivocarse es interesante, pero supone wsimport sería hacer las cosas bien. De todos modos, esta es mi package-info.java
@XmlSchema(
namespace = "http://www.acme.com/ws",
elementFormDefault = XmlNsForm.QUALIFIED)
package it.sky.guidaTv.service.remote;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNsForm;
y esta es la parte pertinente de la clase
/*
* <p>Java class for responseINFOWL complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="responseINFOWL">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="result" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="descriptionerr" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="transid" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="ndserr" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="wallet" type="{http://www.acme.com/ws}t_wallet" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "responseINFOWL", propOrder = {
"result", "descriptionerr", "transid", "ndserr", "wallet" })
public class ResponseINFOWL {
@XmlElement(required = true)
protected String result;
@XmlElement(required = true)
protected String descriptionerr;
@XmlElement(required = true)
protected String transid;
protected String ndserr;
protected TWallet wallet;
// getters, setters and all.
}
ResponseINFOWL
He intentado jugar un poco con los espacios de nombres en package-info
pero todavía no hay alegría.
¿Puede proporcionar muestras de los mensajes y clases? Esto ayudará a determinar dónde está la falta de coincidencia en el mapeo. –
Tal vez podría publicar un archivo wsdl y una clase de prueba anonimizados adecuadamente, todo lo demás en mi caso es generado por wsimport. Lo curioso es que otros servicios del mismo tercero funcionan bien. – agnul