SOAP服务器将Web方法参数读取为null

时间:2014-10-26 23:06:29

标签: web-services soap wsdl soap-client

我有一个连接到SOAP服务器端点的客户端:

Endpoint.publish("http://localhost:8081/todo", new ToDoWebService());

服务器提供了下一个简单的方法:

@WebService
public class ToDoWebService {

    @WebMethod()
    public String addToDo(String task, String context, String project, int priority) {
        return "ToDo: \n "
                + "\t Task    :  "+task+"\n"
                + "\t Context :  "+context+"\n"
                + "\t Project :  "+project+"\n"
                + "\t Priority:  "+priority;
    }
}

这是客户

public class Client {

    public static void main(String[] args) {
        ToDoWebServiceService tdwss = new ToDoWebServiceService();
        ToDoWebService tdws = tdwss.getToDoWebServicePort();

        System.out.println(tdws.addToDo("Task 1","My Context","My Project",9));
    }
}

问题是客户端和服务器之间的连接是成功的,但并不完全:从客户端到服务的参数传递没有按预期进行,这是客户端执行后的结果:

enter image description here

服务器无法正确接收客户端使用方法“addToDo()”调用传递的参数。它返回预期的字符串格式,但使用 nulls 而不是客户端传递的参数。这就是我无法弄清楚的......

当然,我非常有信心 WSDL文件写得很好:

<?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.8 svn-revision#13980. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.8 svn-revision#13980. -->
    <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://todows.bigws/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://todows.bigws/" name="ToDoWebServiceService">
        <types>
        <xsd:schema>
            <xsd:import namespace="http://todows.bigws/" schemaLocation="toDo.xsd"/>
        </xsd:schema>
        </types>
        <message name="addToDo">
            <part name="parameters" element="tns:addToDo"/>
        </message>
        <message name="addToDoResponse">
            <part name="parameters" element="tns:addToDoResponse"/>
        </message>
        <portType name="ToDoWebService">
            <operation name="addToDo">
                <input wsam:Action="http://todows.bigws/ToDoWebService/addToDo" message="tns:addToDo"/>
                <output wsam:Action="http://todows.bigws/ToDoWebService/addToDoResponse" message="tns:addToDoResponse"/>
            </operation>
        </portType>
        <binding name="ToDoWebServicePortBinding" type="tns:ToDoWebService">
            <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
            <operation name="addToDo">
                <soap:operation soapAction=""/>
                <input>
                    <soap:body use="literal"/>
                </input>
                <output>
                    <soap:body use="literal"/>
                </output>
            </operation>
        </binding>
        <service name="ToDoWebServiceService">
            <port name="ToDoWebServicePort" binding="tns:ToDoWebServicePortBinding">
                <soap:address location="http://localhost:8081/todo"/>
            </port>
        </service>
    </definitions>

以及 架构“toDo.xsd”

<?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.2.8 svn-revision#13980. -->
<xs:schema xmlns:tns="http://todows.bigws/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://todows.bigws/">

    <xs:element name="addToDo" type="tns:addToDo"/>

    <xs:element name="addToDoResponse" type="tns:addToDoResponse"/>

    <xs:complexType name="addToDo">
        <xs:sequence>
            <xs:element name="task" type="xs:string" minOccurs="0"/>
            <xs:element name="context" type="xs:string" minOccurs="0"/>
            <xs:element name="project" type="xs:string" minOccurs="0"/>
            <xs:element name="priority" type="xs:int" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="addToDoResponse">
        <xs:sequence>
            <xs:element name="return" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

我在服务器方法中尝试了不同的操作,因为在文件中使用参数编写字符串,但结果是相同的,错误导致参数 null 。这就是我认为失败的位置在服务器接收传递给“addToDo()”方法的参数的方式。

我已经回顾了WSDL&amp;模式文件一遍又一遍....但我无法找到是什么让这个代码运行错误。我也用SoapUI软件测试了这段代码,结果是一样的。 ¿有什么想法吗?

P.D。:对所有发布的代码感到抱歉。

如果您需要整个项目:my SOAP project at GitHub

1 个答案:

答案 0 :(得分:3)

我在项目todows-cli-ws中查看了您的WSDL和XSD,问题是客户端项目中的WSDL和XSD文件已过时

例如,这是服务器的XSD文件的当前内容。

<xs:schema xmlns:tns="http://todows.bigws/" xmlns:xs="http://www.w3.org/2001/XMLSchema"    
    version="1.0" targetNamespace="http://todows.bigws/">
 <xs:element name="addToDo" type="tns:addToDo"/>
 <xs:element name="addToDoResponse" type="tns:addToDoResponse"/>
 <xs:element name="listToDo" type="tns:listToDo"/>
 <xs:element name="listToDoResponse" type="tns:listToDoResponse"/>
 <xs:element name="removeToDo" type="tns:removeToDo"/>
 <xs:element name="removeToDoResponse" type="tns:removeToDoResponse"/>
 <xs:complexType name="addToDo">
  <xs:sequence>
   <xs:element name="arg0" type="xs:string" minOccurs="0"/>
   <xs:element name="arg1" type="xs:string" minOccurs="0"/>
   <xs:element name="arg2" type="xs:string" minOccurs="0"/>
   <xs:element name="arg3" type="xs:int"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="addToDoResponse">
  <xs:sequence>
   <xs:element name="return" type="xs:string" minOccurs="0"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="removeToDo">
  <xs:sequence/>
 </xs:complexType>
 <xs:complexType name="removeToDoResponse">
  <xs:sequence>
   <xs:element name="return" type="xs:string" minOccurs="0"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="listToDo">
  <xs:sequence/>
 </xs:complexType>
 <xs:complexType name="listToDoResponse">
  <xs:sequence>
   <xs:element name="return" type="xs:string" minOccurs="0"/>
  </xs:sequence>
 </xs:complexType>
</xs:schema>

请注意,参数的当前名称是 arg0 arg1 arg2 arg3 。服务器期望作为参数名称​​任务上下文项目优先级,因此调用该方法默认值( String null int 0 )。