如何从axis客户端soap头中删除mustunderstand属性。即使我没有特别设置它,当我设置soap头信息必须理解和actor属性自动添加到soap消息。有人知道怎么去掉吗?我使用Axis2 1.4版本的wsdl2java来创建我的ws客户机。
这些方法都不适合我,因为:
- 我正在使用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<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
}
如果您想在AXIS客户机中禁用必须理解的检查在代码中添加以下行:
_call.setProperty(Call.CHECK_MUST_UNDERSTAND, new Boolean(false));
则永远不会调用AXIS客户端的 must理解检查器。
在我的情况下,它工作手动删除属性从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);
}
我最近遇到了类似的情况,通过谷歌搜索,我设法找到了以下解决方案:
如果使用了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(true|false);
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/handlers/package-summary.html
我正在使用axis 1.4客户端与ws安全
在我的情况下,正如Reinhard所说这工作
MyService service = new MyServiceLocator();
MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint();
((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);