gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:03:59 26 4
gpt4 key购买 nike

我是 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 中添加返回类型,但它给了我:

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to bla.bla.bla.BaggageReply at com.sun.proxy.$Proxy46.IdentifyBaggage(Unknown Source)

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

添加返回类型的方法是什么?

最佳答案

看来您首先进行契约(Contract)(您有 WSDL 作为起点)SOAP 客户端开发。

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

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

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

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

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

1、契约(Contract)优先的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>

关键是和定义的类(在输出标签的message属性中)。然后重新生成客户端和服务端,更新serverimpl,正确实现客户端。

2、代码优先开发(你已经开始编写自己的java类了)

在这种情况下,您是一位熟练的开发人员,非常清楚如何做到这一点:)假设您有服务器端代码,我将复制输入类 (com.amadeus.xml.bla_bla.IdentifyBaggage),将其重命名为输出类,并更新 localName 和 QName 的命名空间,成员、setter/getters 等,并将操作的 void 返回值替换为此类。最后一件事是更新操作或 web 方法以在最后返回 BaggageReply。当然,您的客户端也必须进行修改才能使用此回复进行操作。

关于java - 从端口的方法返回一个类而不是 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58167037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com