2011-09-15 18 views
8

Estoy trabajando en un servidor de aplicaciones Java 6 que tiene un servicio web para recibir mensajes SOAP que contienen un mensaje HL7. La aplicación Java se ejecuta en Glassfish 3.1. El cliente es una aplicación C# desarrollada por un tercero (que se ejecuta en el marco Microsoft .NET 4.0) y envía estos mensajes SOAP al servidor Java.Método de servicio web Java que recibe el argumento nulo del cliente C#

Mi problema inicial era que el cliente no podía analizar el WSDL generado por el servidor. Desde entonces resolví esto implementando mi propio WSDL personalizado y ajustándolo en consecuencia. Esto permitió al cliente analizar el WSDL y enviar mensajes SOAP a mi aplicación de servidor Java.

Sin embargo, cada vez que se recibe un mensaje en el lado del servidor, el parámetro (denominado "putXML") recibe un valor null.

El registro del servidor Glassfish muestra lo siguiente cuando se recibe un mensaje:

Received WS-I BP non-conformant Unquoted SoapAction HTTP header: http://MyProject.MyPackage/putHL7Data 
Received Message: null 

Aquí es el WSDL personalizado que he creado y asociado a mi de SOAP servicio web:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions 
     targetNamespace="http://MyProject.MyPackage/" 
     xmlns="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
     xmlns:s="http://www.w3.org/2001/XMLSchema" 
     xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
     xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
     xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
     xmlns:tns="http://MyProject.MyPackage/" 
     xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:wsp="http://www.w3.org/ns/ws-policy" 
     xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <wsdl:types> 
     <s:schema elementFormDefault="qualified" targetNamespace="http://MyProject.MyPackage/"> 
     <s:element name="putHL7Data"> 
      <s:complexType> 
       <s:sequence> 
        <s:element name="putXML" type="s:string" minOccurs="0" maxOccurs="1"/> 
       </s:sequence> 
      </s:complexType> 
     </s:element> 
     <s:element name="putHL7DataResponse"> 
      <s:complexType> 
       <s:sequence> 
        <s:element name="return" type="s:string" minOccurs="0" maxOccurs="1"/> 
       </s:sequence> 
      </s:complexType> 
     </s:element> 
     </s:schema> 
    </wsdl:types> 
    <wsdl:message name="putHL7DataSoapIn"> 
     <wsdl:part name="parameters" element="tns:putHL7Data"/> 
    </wsdl:message> 
    <wsdl:message name="putHL7DataSoapOut"> 
     <wsdl:part name="parameters" element="tns:putHL7DataResponse"/> 
    </wsdl:message> 
    <wsdl:portType name="MyHandlerSoap"> 
     <wsdl:operation name="putHL7Data"> 
     <wsdl:input message="tns:putHL7DataSoapIn"/> 
     <wsdl:output message="tns:putHL7DataSoapOut"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="MyHandlerSoap" type="tns:MyHandlerSoap"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <wsdl:operation name="putHL7Data"> 
     <wsdl:input> 
      <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
      <soap:body use="literal"/> 
     </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="MyHandler"> 
     <wsdl:port name="MyHandlerPort" binding="tns:MyHandlerSoap"> 
     <soap:address location="REPLACE_WITH_ACTUAL_URL"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Y aquí está el servicio web Java:

@WebService(serviceName = "MyHandler", wsdlLocation = "WEB-INF/wsdl/MyHandler.wsdl") 
public class MyHandler { 
    @WebMethod(operationName = "putHL7Data") 
    public String putHL7Data(@WebParam(name = "putXML") String xml) { 
     // Handle message 
    } 
} 

¿Hay algo que esté haciendo mal?

¿Qué puedo hacer para arreglar el servicio web Java para que reciba correctamente un valor no nulo?

¿Este es un problema con el cliente? Si es así, ¿necesitaría crear algún tipo de interceptor?

actualización

Hoy he intentado crear un cliente rápida C# que utiliza mi servicio web SOAP de Java. A continuación se muestra el código:

namespace TestSoap 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ServiceReference1.MyHandlerSoapClient ws = new ServiceReference1.MyHandlerSoapClient(); 
      string result = ws.putHL7Data("Test");  
      Console.WriteLine("Response: " + result); 
      Console.ReadLine(); 
     } 
    } 
} 

Cuando ejecuto este cliente, recibo el mismo valor en el parámetro null cuando yo estaba esperando a ver la cadena Test. Además, espero que result contenga una cadena de respuesta pero también devuelve un valor de null.

Recuerde, no puedo modificar la aplicación de cliente de C# externa. ¿Hay algo que pueda hacer en Java?

Actualización 2

I añadió recientemente una clase de cadena controlador que está capturando y el registro de los mensajes SOAP primas. El mensaje enviado por el cliente se ve así:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Header/> 
    <soap:Body> 
    <putHL7Data xmlns="http://MyProject.MyPackage/"> 
     <putXML>... Encoded XML Here ...</putXML> 
    </putHL7Data> 
    </soap:Body> 
</soap:Envelope> 
+0

Parece probable que el servidor está recibiendo nula porque el cliente está incluido el parámetro de la petición. – DwB

+0

@DwB No estoy seguro de lo que quieres decir. ¿Podrías elaborar? –

+0

El idioma de origen tiene cero impacto en la llamada al servicio web. Si la llamada al servicio de un parámetro es nula en el servidor, se debe a que se envió como nulo desde el cliente. – DwB

Respuesta

5

Después de ser señalado en la dirección correcta por @dlawrence, pude resolver mi problema. Como mencioné en la pregunta, aún necesitaba usar un wsdl personalizado.Solo tuve que hacer algunos cambios en el wsdl y el código de Java para resolver el problema.

Aquí es un diff que representa mis cambios en el WSDL:

--- /tmp/a 2011-09-19 15:05:21.132065003 -0400 
+++ /tmp/b 2011-09-19 14:41:28.302064999 -0400 
@@ -15,11 +15,11 @@ 
     xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <wsdl:types> 
-  <s:schema elementFormDefault="qualified" targetNamespace="http://MyProject.MyPackage/"> 
+  <s:schema targetNamespace="http://MyProject.MyPackage/">   
      <s:element name="putHL7Data"> 
      <s:complexType> 
       <s:sequence> 
-     <s:element name="putXML" type="s:string" minOccurs="0" maxOccurs="1"/> 
+     <s:element name="putXML" type="s:string" form="qualified" minOccurs="0" maxOccurs="1"/> 
       </s:sequence> 
      </s:complexType> 
      </s:element> 
@@ -47,6 +47,6 @@ 
    <wsdl:binding name="MyHandlerSoap" type="tns:MyHandlerSoap"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 
     <wsdl:operation name="putHL7Data"> 
-   <soap:operation soapAction="" style="document"/> 
+   <soap:operation soapAction="http://MyProject.MyPackage/putHL7Data" style="document"/> 
      <wsdl:input> 
      <soap:body use="literal"/> 
      </wsdl:input> 

Básicamente, este fue un tres partes del arreglo ...
1). Necesitaba eliminar el atributo elementFormDefault="qualified" de la etiqueta <s:schema>.
2). Luego tuve que agregar el atributo form="qualified" en mi etiqueta <s:element name="putXML" ...>.
3). Finalmente, necesitaba asegurarme de tener el atributo soapAction="http://MyProject.MyPackage/putHL7Data" en mi etiqueta <soap:operation>.

Aquí es un diff que representa mis cambios en el método de web de Java:

--- /tmp/a 2011-09-19 14:57:49.582065002 -0400 
+++ /tmp/b 2011-09-19 15:00:06.942065007 -0400 
@@ -1,7 +1,7 @@ 
@WebService(serviceName = "MyHandler", wsdlLocation = "WEB-INF/wsdl/MyHandler.wsdl") 
public class MyHandler { 
    @WebMethod(operationName = "putHL7Data") 
- public String putHL7Data(@WebParam(name = "putXML") String xml) { 
+ public String putHL7Data(@WebParam(name = "putXML", targetNamespace="http://MyProject.MyPackage/") String xml) { 
     // Handle message 
    } 
} 

Como se puede ver, todo lo que tenía que hacer era añadir el atributo targetNamespace a mi @WebParam.

3

¿Ha intentado eliminar el atributo @WebParam? No debería ser necesario ya que no hay ambigüedad con su servicio web aquí y es posible que necesite establecer el targetNamespace para que encuentre el atributo correctamente.

+1

Intenté eliminar el "@WebParam" pero no hubo ningún efecto. ¿A dónde iría el "targetNamespace"? Dentro de la definición "@WebParam"? –

+0

Sí, debe ser un atributo de @WebParam. – dlawrence

+0

¡Gracias por tu consejo! Pude averiguar cómo ajustar mi wsdl personalizado al ver lo que hace al agregar "targetNamespace" a los wsdl generados. Pronto publicaré mi propia respuesta explicando lo que hice para resolver mi problema. –

2

tengo el mismo mensaje en mi consola glassfish. En mi proyecto androide con la función ksoap i cambiado el siguiente código:

soapEnvelope.setOutputSoapObject(soapReq); 
HttpTransportSE httpTransport = new HttpTransportSE(url,timeOut); 
try{ 

     if (headers!=null){ 
      // original code // my headers are null 
      httpTransport.call("http://service.iswitch.com/", soapEnvelope,headers); 
     }else{ 
      httpTransport.call("\"http://service.iswitch.com/"\", soapEnvelope); 
     } 
     SoapObject result=(SoapObject)soapEnvelope.bodyIn; 
     if (result.hasProperty("moveResult")) 
     { 

.... funciona ...);

la clase i generado con http://www.wsdl2code.com

Cuestiones relacionadas