2011-09-19 84 views
3

如何從axis中刪除mustunderstand屬性soap.even我沒有特別設置它,當我設置soap頭信息mustundertand和actor屬性被自動添加到soap消息中。是否有人知道如何刪除它們? 我正在使用Axis2 1.4版本的wsdl2java來創建我的ws客戶端。從肥皂頭中刪除mustUnderstand屬性

回答

0

1)您是否使用Axis SOAPHeaderElement,如果是,您是否將mustUnderstand設置爲false?

2)由於您使用wsdl2java生成客戶端,因此WSDL(或更準確地說,模式)很可能包含SOAP綁定中引用的元素的mustUnderstand屬性。所以當wsdlToJava生成客戶端代碼時,這些屬性自然會被添加。有關mustUnderstand屬性的描述,請參閱here。 如果修改WSDL不可行,並且您必須從頭中刪除此屬性,那麼我想您可以嘗試使用處理程序執行此操作。

3)不可取,但是如果您確實必須刪除此屬性那麼我想你可以添加改變了報頭中的客戶端處理程序:http://ws.apache.org/axis/java/apiDocs/org/apache/axis/handlers/package-summary.html

+0

1)是的我正在使用SOAPHeaderElement,但我試着用不設置mustunderstand並將它設置爲false.nothing實際上沒有改變。我的代碼是這樣的:\t SOAPHeaderElement header = new SOAPHeaderElement( \t \t「ns1://x.x.x.x/abc.asmx」,「AuthHeader」); \t \t SOAPElement node = header.addChildElement(「user_1」); \t \t node.addTextNode(「abc」); \t \t SOAPElement node2 = header.addChildElement(「pass_1」); \t \t node2.addTextNode(「123」); \t \t _call.addHeader(header); – cacert

+0

當你說什麼都沒有改變時,你的意思是說SOAP頭始終顯示爲mustUnderstand = false?你有WSSDL /架構你可以發佈(不要發佈整個事情,如果它很長......只是相關的部分)。 –

+0

是的,我的意思是完全that.i認爲軸代碼添加mustunderstand和演員屬性默認行爲時,肥皂頭參數設置。當我刪除肥皂頭代碼比mustunderstand和演員參數也刪除。 – cacert

6

如果您希望禁用必須瞭解您在你 到下面的行添加到您的代碼AXIS客戶端:

_call.setProperty(Call.CHECK_MUST_UNDERSTAND, new Boolean(false)); 

然後MustUnd不會調用AXIS客戶端的erstandChecker

0

我在我的情況下,使用軸1.4客戶端WS安全

爲萊因哈德說 這個工作

MyService service = new MyServiceLocator(); 
MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint(); 

((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE); 
0

我最近有類似的情況掙扎,做一些谷歌-ING我設法找到以下解決方案。

使用Axis2後,您可能會生成一個MyWSStub文件,其中包含對您的服務的調用。 創建一個可擴展存根的包裝類(最好不要觸及自動生成的存根文件),例如MyWSStubWrapper:

public class MyWSStubWrapper extends MyWSStub { 

/** 
* @throws AxisFault 
*/ 
public MyWSStubWrapper() throws AxisFault { 
} 

/** 
* @param configurationContext 
* @throws AxisFault 
*/ 
public MyWSStubWrapper(ConfigurationContext configurationContext) throws AxisFault { 
    super(configurationContext); 
} 

/** 
* @param targetEndpoint 
* @throws AxisFault 
*/ 
public MyWSStubWrapper(String targetEndpoint) throws AxisFault { 
    super(targetEndpoint); 
} 

/** 
* @param configurationContext 
* @param targetEndpoint 
* @throws AxisFault 
*/ 
public MyWSStubWrapper(ConfigurationContext configurationContext, String targetEndpoint) throws AxisFault { 
    super(configurationContext, targetEndpoint); 
} 

/** 
* @param configurationContext 
* @param targetEndpoint 
* @param useSeparateListener 
* @throws AxisFault 
*/ 
public MyWSStubWrapper(ConfigurationContext configurationContext, String targetEndpoint, boolean useSeparateListener) throws AxisFault { 
    super(configurationContext, targetEndpoint, useSeparateListener); 
} 

@Override 
protected void addHeader(OMElement omElementToadd, SOAPEnvelope envelop, boolean mustUnderstand) { 
    SOAPHeaderBlock soapHeaderBlock = envelop.getHeader().addHeaderBlock(omElementToadd.getLocalName(), omElementToadd.getNamespace()); 
    OMNode omNode = null; 

    // add child elements 
    for (Iterator iter = omElementToadd.getChildren(); iter.hasNext();) { 
     omNode = (OMNode) iter.next(); 
     iter.remove(); 
     soapHeaderBlock.addChild(omNode); 
    } 

    OMAttribute omatribute = null; 
    // add attributes 
    for (Iterator iter = omElementToadd.getAllAttributes(); iter.hasNext();) { 
     omatribute = (OMAttribute) iter.next(); 
     soapHeaderBlock.addAttribute(omatribute); 
    } 
} 

}

記住,上面的代碼將完全刪除soapenv

熊:mustUnderstand屬性=「0 | 1」從你的頭,如果你想添加你需要調用soapHeaderBlock.setMustUnderstand(真|假);在你的代碼中的某處。

6

沒有這些解決方案的工作對我來說,如:

望着回答「Adding ws-security to wsdl2java generated classes」幫我寫爲我工作的解決方案:

void addSecurityHeader(Stub stub, final String username, final String password) { 
    QName headerName = new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security"); // Or any other namespace that fits in your case 
    AtomicReference<SOAPHeaderElement> header 
    = new AtomicReference<SOAPHeaderElement> 
     (new SOAPHeaderElement(headerName) {      
      { 
      SOAPElement utElem = addChildElement("UsernameToken"); 
      utElem.addChildElement("Username").setValue(username); 
      utElem.addChildElement("Password").setValue(password); 
      } 
      @Override 
      public void setAttribute(String namespace, String localName, String value) { 
      if (!Constants.ATTR_MUST_UNDERSTAND.equals(localName)) { // Or any other attribute name you'd want to avoid 
       super.setAttribute(namespace, localName, value); 
      } 
      } 
     }); 
    SOAPHeaderElement soapHeaderElement = header.get(); 
    soapHeaderElement.setActor(null);  // No intermediate actors are involved. 
    stub.setHeader(soapHeaderElement); // Finally, attach the header to the stub 
} 
+0

節省了我的生活...日Thnx – Aykut

+0

這完美地工作!謝謝。我不希望任何子節點,所以我用這個新的SOAPHeaderElement( \t \t \t \t headerName){ \t \t \t { \t \t \t \t的setValue(值); \t \t \t} – atripathi

+0

謝謝!這個問題應該被接受爲這個問題的有效答案。 SOAPHeaderElement類默認向頭添加了mustUnderstand和actor屬性,並且這是(迄今爲止)通過首先過濾添加/設置來移除它的唯一方法。 –

1

對我來說,它的工作手動從的SOAPHeader

SOAPHeader header = env.getHeader(); 
OMChildrenQNameIterator childrenWithName = (OMChildrenQNameIterator) header.getChildrenWithName(omElementauthentication.getQName()); 
    while (childrenWithName.hasNext()) { 
     org.apache.axiom.om.OMElement omElement = (org.apache.axiom.om.OMElement) childrenWithName.next(); 
     QName mustAnderstandQName = omElement.resolveQName("soapenv:mustUnderstand"); 
     if (mustAnderstandQName == null) { 
      continue; 
     } 
     OMAttribute mustAnderstandAttribute = omElement.getAttribute(mustAnderstandQName); 
      if (mustAnderstandAttribute == null) { 
       continue; 
      } 
     omElement.removeAttribute(mustAnderstandAttribute); 
    } 
刪除屬性