从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 。
这些解决方案都不适合我,因为:
- 我正在与Axis合作(不是Axis2)
- 我根本不希望指定属性,因为我的服务器对应物不支持它(“未声明’ http://schemas.xmlsoap.org/soap/envelope/:mustUnderstand ‘属性”是在这种情况下的典型答案)。
查看“ 将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);