java - generate - org apache axis2 library download
¿Cómo agrego una referencia de espacio de nombres a una respuesta SOAP con Apache Axis2 y WSDL2Java? (2)
Usando WSDL2Java
Si ha utilizado la herramienta Axis2 WSDL2Java, está atrapado con lo que genera para usted. Sin embargo, puedes intentar cambiar el esqueleto en esta sección:
// create SOAP envelope with that payload
org.apache.axiom.soap.SOAPEnvelope env = null;
env = toEnvelope(
getFactory(_operationClient.getOptions().getSoapVersionURI()),
methodName,
optimizeContent(new javax.xml.namespace.QName
("http://tempuri.org/","methodName")));
//adding SOAP soap_headers
_serviceClient.addHeadersToEnvelope(env);
Para agregar el espacio de nombre al sobre, agregue estas líneas en algún lugar:
OMNamespace xsi = getFactory(_operationClient.getOptions().getSoapVersionURI()).
createOMNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");
env.declareNamespace(xsi);
Codificado a mano
Si está "codificando manualmente" el servicio, puede hacer algo como esto:
SOAPFactory fac = OMAbstractFactory.getSOAP11Factory();
SOAPEnvelope envelope = fac.getDefaultEnvelope();
OMNamespace xsi = fac.createOMNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");
envelope.declareNamespace(xsi);
OMNamespace methodNs = fac.createOMNamespace("http://somedomain.com/wsinterface", "ns1");
OMElement method = fac.createOMElement("CreateEntityTypesResponse", methodNs);
//add the newkeys and errors as OMElements here...
Exponer el servicio en aar
Si está creando un servicio dentro de un aar, es posible que pueda influir en el mensaje SOAP producido al usar el espacio de nombres de destino o las propiedades del espacio de nombres del esquema (consulte este artículo ).
Espero que ayude.
Estoy mirando la salida SOAP de un servicio web que estoy desarrollando, y noté algo curioso:
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<ns1:CreateEntityTypesResponse xmlns:ns1="http://somedomain.com/wsinterface">
<newKeys>
<value>1234</value>
</newKeys>
<newKeys>
<value>2345</value>
</newKeys>
<newKeys>
<value>3456</value>
</newKeys>
<newKeys xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<newKeys xsi:nil="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<errors>Error1</errors>
<errors>Error2</errors>
</ns1:CreateEntityTypesResponse>
</soapenv:Body>
</soapenv:Envelope>
Tengo dos elementos newKeys que son nulos, y ambos elementos insertan una referencia de espacio de nombres para xsi. Me gustaría incluir ese espacio de nombres en el elemento Soapenv: Envelope para que la referencia del espacio de nombres solo se envíe una vez.
Estoy usando WSDL2Java para generar el esqueleto del servicio, por lo que no tengo acceso directo a la API de Axis2.
Otra opción es que la variable MY_QNAME tenga el prefijo vacío.
public static final QName MY_QNAME = new QName("http://www.hello.com/Service/",
"tagname",
"prefix");
Entonces, si lo llenas, entonces funciona.