从端口的方法返回一个类而不是void

时间:2019-09-30 11:30:01

标签: java soap cxf soap-client webservice-client

我是SOAP服务的初学者。我有一个使用案例来使用一些SOAP方法。因此,为此,我对客户端进行了编码以获取一些服务端口的方法数据。

当前,我从导入的WSDL中意识到,特定的服务方法具有void返回类型。但是,我希望有返回端口方法。例如:

这是WSDL中的当前行为:

SomeService ss = new SomeService();
ProxyPort port = ss.getPort();
port.IdentifyBaggage(identifyBaggageIndicators,
                bagTagDetailsTopLevel, baggageGroupInfo, flightDetailsResponse, quantityDetails, dummySegment);

但是,我想要的行为是:

SomeService ss = new SomeService();
ProxyPort port = ss.getPort();
BaggageReply reply= port.IdentifyBaggage(identifyBaggageIndicators,
                bagTagDetailsTopLevel, baggageGroupInfo, flightDetailsResponse, quantityDetails, dummySegment);

我尝试在SEI中添加返回类型,但这给了我

  

线程“ main”中的异常java.lang.ClassCastException:   无法将java.util.ArrayList强制转换为bla.bla.bla.BaggageReply   com.sun.proxy。$ Proxy46.IdentifyBaggage(未知来源)

SEI看起来像这样:

/**
    * @param identifyBaggageIndicators
    * @param bagTagDetails
    * @param baggageGroupInfo
    * @param routingDetails
    * @param historicalDays
    * @param dummy
    */
   @WebMethod(operationName = "IdentifyBaggage", action = "http://webservices.amadeus.com/endpoint1")
   @RequestWrapper(localName = "IdentifyBaggage", targetNamespace = "http://xml.amadeus.com/endpoint1", className = "com.amadeus.xml.bla_bla.IdentifyBaggage")
   @ResponseWrapper(localName = "BaggageReply", targetNamespace = "http://xml.amadeus.com/endpoint2", className = "com.amadeus.xml.bla1_bla1.BaggageReply")
   public void dcsbagIdentifyBaggage(
       @WebParam(name = "identifyBaggageIndicators", targetNamespace = "http://some.host.com/endpoint1")
       List<StatusTypeI> identifyBaggageIndicators,
       @WebParam(name = "bagTagDetails", targetNamespace = "http://some.host.com/endpoint1")
       BaggageInformationTypeI bagTagDetails,
       @WebParam(name = "baggageGroupInfo", targetNamespace = "http://xml.amadeus.com/endpoint1")
       IdentifyBaggage.BaggageGroupInfo baggageGroupInfo,
       @WebParam(name = "routingDetails", targetNamespace = "http://xml.amadeus.com/endpoint1")
       FlightDetailsResponseType routingDetails,
       @WebParam(name = "historicalDays", targetNamespace = "http://xml.amadeus.com/endpoint1")
       NumberOfUnitsType historicalDays,
       @WebParam(name = "dummy", targetNamespace = "http://xml.amadeus.com/endpoint2", mode = WebParam.Mode.OUT)
               com.amadeus.xml.bla_bla.DummySegmentTypeI dummy);

添加返回类型的方式可能是什么?

1 个答案:

答案 0 :(得分:0)

似乎您是在首先进行Contract(以WSDL作为起点)的SOAP客户端开发。

您必须连接到某个地方并且服务为“静态”(无法更改)

1,如果无法更改SOAP服务(例如,因为它不是您的),并且您拥有的WSDL是正确的(由运行中的服务制成),则您无法这样做。

2,如果您拥有的WSDL已过时,并且看到WSDL中不存在的返回类型,只需获取新的WSDL,生成另一个客户端类并使用它们即可。

您必须连接到属于您的服务(客户端和服务器端均由您开发)

这是更有趣的部分,在这里我们有两种不同的方式:

1,首先进行Web服务开发(我更喜欢)

您使用所有操作和复杂类型从头开始构建了WSDL。 您必须创建一个新的 BaggageReply 复杂类型,并对此进行类似的修改操作(随机wsdl示例):

    <message name="GetLastTradePriceInput">
        <part name="body" element="xsd1:TradePriceRequest"/>
    </message>

    <message name="GetLastTradePriceOutput">
        <part name="body" element="xsd1:TradePrice"/>
    </message>

    <portType name="StockQuotePortType">
        <operation name="GetLastTradePrice">
           <input message="tns:GetLastTradePriceInput"/>
           <output message="tns:GetLastTradePriceOutput"/>
        </operation>
    </portType>

键是和定义的类(在output标记的message属性中)。 然后重新生成客户端和服务器端,更新serverimpl,并正确实施客户端。

2,首先进行代码开发(您已经开始编写自己的Java类)

在这种情况下,您是一个熟练的开发人员,非常了解如何执行此操作:) 假设您具有服务器端代码,我将复制输入类( com.amadeus.xml.bla_bla.IdentifyBaggage )重命名为输出类,并更新localName和QName的命名空间,成员,设置器/获取器等,并将该操作的void返回值替换为此类。 最后一件事是更新操作或网络方法,最后返回 BaggageReply 。 当然,您的客户也必须进行修改,以使此回复有所作为。