2013-08-05 79 views
0

我正在尝试创建一些可以为公司思科手机增添一点功能的宁静web服务。基本思想很简单,用户可以获得一个小型客户端,他们需要输入登录名和密码。当他们这样做时,他们的电话/电话已经注册到我的安宁服务中,并且他们的手机上增加了功能。当他们注销时,他们会被取消注册。为了提供额外的功能(如调整后的来电者信息等),我需要Cisco AXL API。这是一个基于SOAP的API。我已经使用wsdl生成了java类。当我使用生成的类创建测试客户端时,所有工作都正常。AXL的RESTful服务

但这里谈到的问题:当我尝试在我的应用程序部署在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,但它不能拥有它,因为它已被使用?

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

  • 可以说,它是我的RESTful服务消费,我的肥皂 请求将要使用同一端口?
  • 如果不是,那么可能是什么问题,我该如何解决?

至于更多的信息,这是AXL WSDL如何定义服务:

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

我在想改变皂埠自己。一些谷歌搜索告诉我,我应该在WSDL中这样做,但我真的不知道如何。已有帖子here,但我看不到如何绑定另一个端口名称可以帮助我......

回答

0

与许多涉及思科电话及其管理XmL(AXL)的事情一样,我找到了一种替代方法回答。由于问题从未真正离开我的脑海,我花了昨天的其余时间试图找到一个解决方案,从AXL的东西中获取信息。

虽然上述问题的任何实际答案仍然受欢迎。

我发现的解决方法是this:由于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 soap服务之前,我用SOAPUI尝试了一切。所以我设置了SOAPUI,以便我可以对AXL服务器执行RESTful请求。在SOAPUI中使用我的安静设置,我可以得到和使用SOAPUI和我在java中首次实现soapclient的标准SOAP调用时相同的结果。

但是,当我使用球衣客户端执行相同的getUser请求时,结果中缺少一些重要的字段。我不知道可能会造成这种情况。对于请求getPhone,我甚至没有得到有效的回复。所以要警告。