2014-02-17 110 views
3

我從WSDL創建Java Web服務客戶端的過程中來的。我使用Eclipses的動態Web項目和新的Web服務客戶端,通過Apache Axis 1.4與wsdl2java生成代碼。我需要將SOAP身份驗證添加到此代碼中,以便它與該服務一起使用。在生成的代碼中我找不到這樣做的地方。經過大量研究後,我發現了這一點,迄今爲止,我已將它用作我的代碼的主幹。添加SOAP頭驗證碼

Adding ws-security to wsdl2java generated classes

之前,我得到一個什麼沿着這些線路的「錯誤在處理該消息安全時發生」。現在我越來越

「異常:聽不懂‘的mustUnderstand’物管:{} http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd安全消息:空」

我試過很多事情要突破這個例外。這是我現在到達的代碼。

javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
       "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security"); 
     org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName); 
     header.setActor(null); 
     header.setMustUnderstand(true); 

     // Add the UsernameToken element to the WS-Security header 
     javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken"); 
     utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1"); 
     javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username"); 
     userNameElem.setValue("username"); 
     javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password"); 
     passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
     passwordElem.setValue("password"); 

     header.setProcessed(true); 

     // Finally, attach the header to the binding. 
     setHeader(header) 

此代碼位於我的Binding_ServiceStub類(在其的createCall方法)。

我們已經創建了C#和VB與此WSDL的客戶,並有它剛剛改變ClientCredentials變量,它是生成的代理類的擴展一樣簡單。我希望在這裏有類似的東西。

下面是從WSDL代碼的安全策略以及。

<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy> 

有沒有人知道我還能在這裏做什麼?爲什麼這個例外發生?我試過前綴和setProcesses和setMustUnderstand值的許多不同的組合,一切都是徒勞的(基於我的這種異常的研究)。

而且如果有誰知道,在其中肥皂頭認證添加到WSDL2Java的代碼,我會採取過的方式。只需要這個工作,你會認爲這樣會更直接一點,或者至少有更多的例子。

Update- 確認使用SOAPUI傳遞的相同頭文件正常工作。必須是框架的東西?我創建了一個自定義處理程序來處理SOAP消息,但這並沒有幫助。 Axis 1.4和JAX-RPC是問題嗎? (我知道他們是過時但仍...)

回答

4

酷。我決定只使用Apache CXF作爲我的框架,使用它就像添加一樣簡單

javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider) port; 
    bp.getRequestContext().put("ws-security.username", username); 
    bp.getRequestContext().put("ws-security.password", password); 

哇,這太好了。不要使用Axis 1.4的經驗教訓。