从肥皂头中删除mustUnderstand属性

问题描述:

如何从axis中删除mustunderstand属性soap.even我没有特别设置它,当我设置soap头信息mustundertand和actor属性被自动添加到soap消息中。是否有人知道如何删除它们? 我正在使用Axis2 1.4版本的wsdl2java来创建我的ws客户端。从肥皂头中删除mustUnderstand属性

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

如果您希望禁用必须了解您在你 到下面的行添加到您的代码AXIS客户端:

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

然后MustUnd不会调用AXIS客户端的erstandChecker

我在我的情况下,使用轴1.4客户端WS安全

为莱因哈德说 这个工作

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

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

我最近有类似的情况挣扎,做一些谷歌-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(真|假);在你的代码中的某处。

没有这些解决方案的工作对我来说,如:

望着回答“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属性,并且这是(迄今为止)通过首先过滤添加/设置来移除它的唯一方法。 –

对我来说,它的工作手动从的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); 
    } 
删除属性