2013-08-05 114 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,我甚至沒有得到有效的回覆。所以要警告。