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>
Parece probable que el servidor está recibiendo nula porque el cliente está incluido el parámetro de la petición. – DwB
@DwB No estoy seguro de lo que quieres decir. ¿Podrías elaborar? –
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