Метод веб-службы Java, получающий нулевой аргумент от клиента C # - PullRequest
8 голосов
/ 16 сентября 2011

Я работаю на сервере приложений Java 6, в котором есть веб-служба для получения сообщений SOAP, содержащих сообщение HL7.Java-приложение работает на Glassfish 3.1.Клиент является разработанным сторонним приложением C # (которое работает на платформе Microsoft .net 4.0) и отправляет эти сообщения SOAP на сервер Java.

Моя первоначальная проблема заключалась в том, что клиент не смог выполнить синтаксический анализWSDL, сгенерированный сервером.С тех пор я решил это, реализовав свой собственный WSDL и настроив его соответствующим образом.Это позволило клиенту проанализировать WSDL и отправить сообщения SOAP моему приложению на сервере Java.

Однако каждый раз, когда сообщение принимается на стороне сервера, параметр (с именем «putXML») получает null value.

Журнал сервера Glassfish показывает следующее при получении сообщения:

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

Вот пользовательский WSDL, который я создал и связал с моей веб-службой SOAP:

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

А вот веб-сервис 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
   }
}

Есть ли что-то, что я делаю не так?

Что я могу сделать, чтобы исправить веб-сервис Java, чтобы онправильно получает ненулевое значение?

Это проблема с клиентом?Если да, нужно ли мне создавать какой-то перехватчик?

Обновление

Сегодня я попытался создать быстрый клиент C #, который использует мой веб-сервис Java SOAP.Ниже приведен код:

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();
        }
    }
}

Когда я запускаю этот клиент, я получаю то же значение null в параметре, когда я ожидал увидеть строку Test.Кроме того, я ожидаю, что result будет содержать строку ответа, но она также возвращает значение null.

Помните, я не могу изменить стороннее клиентское приложение C #.Могу ли я что-нибудь сделать на стороне Java?

Обновление 2

Недавно я добавил класс цепочки обработчиков, который захватывает и регистрирует необработанные сообщения SOAP.Отправляемое клиентом сообщение выглядит так:

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

Ответы [ 3 ]

5 голосов
/ 19 сентября 2011

Получив указание в правильном направлении @ dlawrence , я смог решить мою проблему.Как я уже упоминал в этом вопросе, мне все еще нужно было использовать пользовательский wsdl.Мне нужно было всего лишь внести несколько изменений в wsdl и код Java, чтобы решить эту проблему.

Вот разница, представляющая мои изменения в 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>

В основном это было тричастичное исправление ...
1).Мне нужно было удалить атрибут elementFormDefault="qualified" из тега <s:schema>.
2).Затем мне пришлось добавить атрибут form="qualified" в мой тег <s:element name="putXML" ...>.
3).Наконец, мне нужно было убедиться, что у меня есть атрибут soapAction="http://MyProject.MyPackage/putHL7Data" в моем теге <soap:operation>.

Вот разница, представляющая мои изменения в веб-методе 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
    }
 }

Как вывидно, все, что мне нужно было сделать, это добавить атрибут targetNamespace к моему @WebParam.

3 голосов
/ 19 сентября 2011

Вы пытались удалить атрибут @WebParam?Это не требуется, так как здесь нет никакой двусмысленности с вашим веб-сервисом, и, возможно, вам нужно установить targetNamespace для правильного поиска атрибута.

2 голосов
/ 06 ноября 2012

У меня такое же сообщение в моей консоли Glassfish. В моем проекте Android с функцией ksoap я изменил следующий код:

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"))
        {

.... это работает ...);

класс, который я сгенерировал с http://www.wsdl2code.com

...