如何从轴client中的soap标头中删除mustunderstand属性。我没有特别设置它,当我设置soap header info mustundertand并且actor属性被自动添加到soap message.Does有人知道如何删除它们吗? 我正在使用Axis2 1.4版本的wsdl2java来创建我的ws客户端。
答案 0 :(得分:6)
如果您想禁用AXIS客户端中必须了解的检查 将以下行添加到您的代码中:
_call.setProperty(Call.CHECK_MUST_UNDERSTAND, new Boolean(false));
然后永远不会调用AXIS客户端的 MustUnderstandChecker 。
答案 1 :(得分: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
}
答案 2 :(得分:1)
我最近在类似情况下苦苦挣扎,通过做一些谷歌搜索,我找到了以下解决方案。
使用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”;代码中的某个地方。
答案 3 :(得分: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);
}
答案 4 :(得分:0)
1)您使用的是Axis SOAPHeaderElement吗?如果是,您是否将mustUnderstand setter设置为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
答案 5 :(得分:0)
我正在使用带有ws安全性的轴1.4客户端
在我的情况下,莱因哈德说 这工作MyService service = new MyServiceLocator();
MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint();
((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);