首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从端口的方法返回类而不是空

从端口的方法返回类而不是空
EN

Stack Overflow用户
提问于 2019-09-30 11:30:01
回答 1查看 465关注 0票数 0

我是SOAP服务的初学者。我有一个用例来使用一些SOAP方法。因此,我编写了一个客户机来获取一些服务端口的方法数据。

目前,我从导入的WSDL中了解到,特定的服务方法有一个空返回类型。但是,我希望有返回端口方法。例如:

这是WSDL当前的行为:

代码语言:javascript
复制
SomeService ss = new SomeService();
ProxyPort port = ss.getPort();
port.IdentifyBaggage(identifyBaggageIndicators,
                bagTagDetailsTopLevel, baggageGroupInfo, flightDetailsResponse, quantityDetails, dummySegment);

然而,我想要的行为是:

代码语言:javascript
复制
SomeService ss = new SomeService();
ProxyPort port = ss.getPort();
BaggageReply reply= port.IdentifyBaggage(identifyBaggageIndicators,
                bagTagDetailsTopLevel, baggageGroupInfo, flightDetailsResponse, quantityDetails, dummySegment);

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

线程"main“中的com.sun.proxy.$Proxy46.IdentifyBaggage(Unknown异常:不能在com.sun.proxy.$Proxy46.IdentifyBaggage(Unknown源代码中将java.util.ArrayList转换为bla.BaggageReply)

SEI看起来是这样的:

代码语言:javascript
复制
/**
    * @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);

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

EN

回答 1

Stack Overflow用户

发布于 2019-10-09 12:07:04

似乎您首先要做的是契约(您有一个WSDL作为起点) SOAP客户端开发。

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

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

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

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

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

1,合同第一web服务开发(我更喜欢这个)

您从零开始使用每个操作和复杂类型创建了一个WSDL。您必须创建一个新的BaggageReply复杂类型并修改与此类似的操作(随机wsdl示例):

代码语言:javascript
复制
    <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属性中)。然后重新生成客户端和服务器端,更新服务器,并正确地实现客户端。

2,代码优先开发(您已经开始编写自己的java类)

在本例中,您是一个熟练的开发人员,非常了解如何做到这一点:)假设您有服务器端代码,我将将输入类(com.amadeus.xml.bla_bla.IdentifyBaggage)重命名为输出类,并更新localName和QName的命名空间、成员、setters/getters等,并将操作的空返回值替换到该类。最后一件事是更新操作或The方法,以便在最后返回一个BaggageReply。当然,你的客户也必须进行修改,才能得到这个答复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58167037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档