从soap标头中删除mustUnderstand属性

如何从轴client中的soap header中删除mustunderstand属性。我特别设置它,当我设置soap header info mustundertand并且actor属性被自动添加到soap message.Does有人知道如何删除它们吗? 我正在使用Axis2 1.4版本的wsdl2java来创建我的ws客户端。

如果要在AXIS客户端中禁用必须理解的检查,则必须在代码中添加以下行:

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

然后永远不会调用AXIS客户端的MustUnderstandChecker

这些解决方案都不适合我,因为:

查看“ 将ws-security添加到wsdl2java生成的类 ”的答案帮助我编写了一个对我有用的解决方案:

 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 header = new AtomicReference (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 } 

我最近在类似的情况下挣扎,通过做一些谷歌,我设法找到了以下解决方案。

使用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); } } 

}

请记住,如果你想添加你需要调用soapHeaderBlock.setMustUnderstand(true | false),上面的代码将从你的标题中完全删除soapenv:mustUnderstand =“0 | 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); } 

1)您使用的是Axis SOAPHeaderElement吗?如果是,您是否将mustUnderstand setter设置为false?

2)由于您使用wsdl2java生成客户端,因此WSDL(或更准确地说,模式)很可能在SOAP绑定中引用的元素上包含mustUnderstand属性。 因此,当wsdlToJava生成客户端代码时,自然会添加这些属性。 有关mustUnderstand属性的说明,请参见此处 。 如果修改WSDL是不可能的,并且您必须从标题中删除此属性,那么我想您可以尝试使用处理程序执行此操作

3)不可取,但如果你真的必须删除这个属性,那么我想你可以添加一个改变标题的客户端处理程序: http : //ws.apache.org/axis/java/apiDocs/org/apache/axis/处理器/包summary.html

我正在使用带有ws安全性的axis 1.4客户端

就我而言,莱因哈德说这很有效

 MyService service = new MyServiceLocator(); MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint(); ((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);