Java JAX-WS空参数

Java JAX-WS空参数,java,web-services,soap,wsdl,jax-ws,Java,Web Services,Soap,Wsdl,Jax Ws,我已经根据WSDL定义(契约优先方法)创建了一个WS-server。 我已经使用wsimport生成了Java构件,并测试了服务。 现在我有个问题。操作请求的某些(并非所有)参数被解组为null! web服务是基于SOAP的。wsdl遵循文档文本约定。 因此,这是AbstractFDSInfo.wsdl导入的模式: <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.

我已经根据WSDL定义(契约优先方法)创建了一个WS-server。 我已经使用wsimport生成了Java构件,并测试了服务。 现在我有个问题。操作请求的某些(并非所有)参数被解组为null! web服务是基于SOAP的。wsdl遵循文档文本约定。 因此,这是AbstractFDSInfo.wsdl导入的模式:

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        xmlns:tns="http://www.example.com/FDSControl"
        xmlns:com="http://www.example.com/FDSCommon"
        targetNamespace="http://www.example.com/FDSControl" 
        elementFormDefault="qualified">
  <import namespace="http://www.example.com/FDSCommon" schemaLocation="FDSCommon.xsd"/>

  <complexType name="PassengerList">
    <sequence>
      <element ref="com:Passenger" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="FlightInstanceStatusList">
    <sequence>
      <element type="com:flightInstanceStatus" name="Status" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <!-- other operation types here -->

  <element name="setPassengerBoarded">
    <complexType>
      <sequence>
        <element ref="com:FlightInstanceId"/>
        <element type="string" name="Passenger"/>
      </sequence>
    </complexType>
  </element>
  <element name="setPassengerBoardedResponse">
    <complexType/>
  </element>
  <element name="passengerBoardingException">
    <complexType>
        <sequence>
          <element type="token" name="Reason"/>
          <element type="string" name="Detail"/>
        </sequence>
    </complexType>
  </element>

  <!-- Other operation types here --->
您可以看到,我将参数包装在一个类中。 现在的问题是,每当我发送对setPassengerBoarded()的请求时,服务器都会以params.getPassenger()的形式返回null
我的结构/定义有问题吗?

我没有评论权限。我建议首先通过soapui测试web服务。 然后,您将确定服务是否按照预期工作,或者某些参数是否需要更改。
如果测试成功,请尝试在代理中设置相同的参数。

我正在将两个不同的WSDL编译到同一个包中。我将生成的代码拆分为两个包,问题消失了,尽管现在我有重复的类,因此我需要在这些包之间来回转换…

我想澄清
params.getFlightInstanceId()
返回正确的值。您尝试嗅探请求了吗?如果是这样,你可以在你的问题中发表一个例子吗?谢谢。是的:
Marta Cheminab123
正如您所看到的,值在那里您可以看到我添加了一个“test”元素。我尝试使用字符串和数字,但它们总是为空。可能是名称空间问题吗?以null形式到达的值在中,我不认为这是一个与命名空间相关的问题(在本例中,可能会有编译问题),但实际上我不知道原因可能是什么。。。很抱歉
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="FDSControlAbstract"  
             xmlns:tns="http://www.example.com/FDSControl.wsdl"
             xmlns:con="http://www.example.com/FDSControl"
             xmlns:com="http://www.example.com/FDSCommon"
             xmlns="http://schemas.xmlsoap.org/wsdl/"  
             targetNamespace="http://www.example.com/FDSControl.wsdl">
  <types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import namespace="http://www.example.com/FDSCommon" schemaLocation="FDSCommon.xsd"/>
      <xsd:import namespace="http://www.example.com/FDSControl" schemaLocation="FDSControl.xsd"/>
    </xsd:schema>
  </types>

  <message name="setPassengerBoardedRequest">
    <part element="con:setPassengerBoarded" name="Params"/>
  </message>
  <message name="setPassengerBoardedResponse">
    <part element="con:setPassengerBoardedResponse" name="Params"/>
  </message>
  <message name="passengerBoardingException">
    <part element="con:passengerBoardingException" name="Params"/>
  </message>

  <!-- other messages here -->

  <portType name="FDSBoardingPortType">

    <!-- other operations here -->

    <operation name="setPassengerBoarded">
      <documentation>
        Sets a passenger as boarded. If the passenger is already boarded, 
        or the flight instance is not in the boarding status, an exception
        is returned.
      </documentation>
      <input message="tns:setPassengerBoardedRequest"/>
      <output message="tns:setPassengerBoardedResponse"/>
      <fault message="tns:flightInstanceNotFoundException"
             name="flightInstanceNotFoundException"/>
      <fault message="tns:passengerBoardingException"
             name="passengerBoardingException"/>
      <fault message="tns:flightStatusException"
             name="flightStatusException"/>
    </operation>
  </portType>

 <!-- other port types here -->

</definitions>
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="FDSControl"  
             xmlns:tns="http://www.example.com/FDSControl.wsdl"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns="http://schemas.xmlsoap.org/wsdl/"  
             targetNamespace="http://www.example.com/FDSControl.wsdl"
             elementFormDefault="qualified">
  <import namespace="http://www.example.com/FDSControl.wsdl" location="FDSControlAbstract.wsdl"/>

  <!-- other bindings here-->

  <binding name="FDSBoardingSOAP" type="tns:FDSBoardingPortType">

    <!-- other operations here -->

    <operation name="setPassengerBoarded">
      <soap:operation soapAction="http://www.example.com/FDSControl/setPassengerBoarded"/>
      <input> <soap:body use="literal"/> </input>
      <output> <soap:body use="literal"/> </output>
      <fault name="flightInstanceNotFoundException">
        <soap:fault name="flightInstanceNotFoundException" use="literal"/>
      </fault>
      <fault name="passengerBoardingException">
        <soap:fault name="passengerBoardingException" use="literal"/>
      </fault>
      <fault name="flightStatusException">
        <soap:fault name="flightStatusException" use="literal"/>
      </fault>
    </operation> 
  </binding>

  <service name="FDSBoardingSOAPService">
    <port name="FDSBoardingPortType" binding="tns:FDSBoardingSOAP">
      <soap:address location="http://localhost:7070/fdscontrol"/>
    </port>
  </service>

</definitions>
@WebService(name="FDSBoarding",
        endpointInterface="it.polito.dp2.FDS.lab4.server.gen.FDSBoardingPortType",
        wsdlLocation="META-INF/FDSControl.wsdl",
        portName="FDSBoardingPortType",
        serviceName="FDSBoardingSOAPService",
        targetNamespace="http://www.example.com/FDSControl.wsdl")
})
public class FDSControlImpl implements FDSBoardingPortType {
    private FlightManager manager;

    public FDSControlImpl(FlightManager manager) {
        this.manager = manager;
    }

    //other methods here

    @Override
    public SetPassengerBoardedResponse setPassengerBoarded(SetPassengerBoarded params)
    throws FlightInstanceNotFoundException_Exception, FlightStatusException_Exception, PassengerBoardingException_Exception {
        return manager.setPassengerBoarded(params);
    }

}