0

我正在尝试创建一些宁静的网络服务,为公司的思科电话添加一些功能。基本思想很简单,用户得到一个需要输入登录名和密码的小客户端。当他们这样做时,他们的电话/电话会“注册”到我的宁静服务,并且他们会在他们的电话上获得附加功能。当他们注销时,他们将被取消注册。为了提供额外的功能(如调整的呼叫者信息等),我需要 Cisco AXL API。这是一个基于 SOAP 的 API。我已经使用 wsdl 生成了 java 类。当我使用生成的类创建测试客户端时,一切正常。

但是问题来了:当我的应用程序部署在我的 Tomcat 7 容器上时,当我尝试运行一个 soap 请求时,它不再工作了。

问题似乎是 AXLAPIService,它在执行以下代码时挂起:

@WebEndpoint(name = "AXLPort")
public AXLPort getAXLPort() {
    return super.getPort(new QName("http://www.cisco.com/AXLAPIService/", "AXLPort"), AXLPort.class);
}

换句话说,我没有得到soap请求的端口,如果你等待足够长的时间,它会使tomcat崩溃。

我去谷歌搜索。某个论坛上的某个人曾经因为过时的 stax 版本而遇到问题。我在我的 POM 中调整了 stax 版本并再次尝试,但没有任何帮助。

我还在某处读到底层的 javax.xml.ws.Service 实际上有一个端口枚举,当您执行 getPort() 时,您将获得最合适的端口。然后,我查找了 SOAP 的默认端口,即 80,就像用于 RESTful 服务的端口一样。会不会是肥皂服务需要端口 80,但因为它已经在使用中而无法拥有它?

所以,总结一下我的问题:

  • 是不是我的宁静服务使用了我的肥皂请求想要使用的相同端口?
  • 如果没有,那可能是什么问题,我应该如何解决?

作为附加信息,这是 axl wsdl 定义服务的方式:

<service name="AXLAPIService">
<port binding="s0:AXLAPIBinding" name="AXLPort">
  <soap:address location="https://CCMSERVERNAME:8443/axl/"/>
</port>

我正在考虑自己更换肥皂端口。一些谷歌搜索告诉我我应该在 wsdl 中这样做,但我真的不知道该怎么做。这里已经有帖子,但我看不到绑定另一个端口名如何帮助我......

4

1 回答 1

0

与涉及 Cisco Telephony 及其管理 XmL (AXL) 的许多事情一样,我找到了一种解决方法而不是实际答案。因为一个问题从来没有真正离开过我的脑海,所以我昨天剩下的时间都在试图找到一个解决方案,从那个 AXL 东西中获取信息。

不过,仍然欢迎对上述问题的任何实际答案。

我找到的解决方法是由于 SOAP 可以被视为特殊的 http POST 请求,因此应该可以使用 Jersey 等 REST 框架进行 SOAP 调用。你只需要一些额外的代码来使它工作。我使用了链接中的“SoapProvider”,对于那些也在努力解决这个问题的人,我将添加我的代码:

public void doSoapRequest() throws SOAPException, JAXBException{


    ClientConfig config = new DefaultClientConfig();
    config.getClasses().add(SoapProvider.class);
    Client c = Client.create(config);
    c.addFilter(new LoggingFilter());
    c.addFilter(new HTTPBasicAuthFilter("user", "password"));

    MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage message = messageFactory.createMessage();
    SOAPPart soapPart = message.getSOAPPart();
    SOAPEnvelope envelope = soapPart.getEnvelope();
    SOAPBody body = envelope.getBody();
    SOAPElement bodyElement = body.addChildElement(envelope.createName("getCCMVersion", "", "http://www.cisco.com/AXL/API/8.5"));
    message.saveChanges();

    WebResource service = c.resource("https://youraxlmachine:8443/axl/");


    // POST the request
    ClientResponse cr = service.type(MediaType.TEXT_XML).header("SOAPAction", "\"https://youraxlmachine:8443/axl/getCCMVersion\"").post(ClientResponse.class, message);
    message = cr.getEntity(SOAPMessage.class);



    JAXBContext ctx = JAXBContext.newInstance(GetCCMVersionRes.class);
    Unmarshaller um = ctx.createUnmarshaller();
    GetCCMVersionRes response = (um.unmarshal(message.getSOAPPart().getEnvelope().getBody().extractContentAsDocument(), GetCCMVersionRes.class)).getValue();
    System.out.println("HERE COMES THE VERSION!");
    System.out.println(response.getReturn().getComponentVersion().getVersion());
}

除了公司的具体细节外,我尽可能多地保持不变。此代码用于获取 CCM 版本。

警告:根据您执行请求的方式,您可能会为同一请求获得不同的结果。我会解释:

我还实现了其他 AXL 方法,例如 getUser。在我编写 Jersey 肥皂服务之前,我尝试了所有使用 SOAPUI 的方法。所以我设置了 SOAPUI,这样我就可以向 AXL 服务器发出 RESTful 请求。使用我在 SOAPUI 中的宁静设置,我得到的结果与使用 SOAPUI 和我在 java 中的第一个 soapclient 实现时执行标准 SOAP 调用时相同。

但是当我使用 jersey 客户端执行相同的 getUser 请求时,结果中缺少一些重要字段。我不知道是什么原因造成的。对于请求 getPhone,我什至没有得到有效的响应。所以要警告。

于 2013-08-06T12:04:47.750 回答