从soap标头中删除mustUnderstand属性

时间:2011-09-19 15:13:26

标签: java soap axis

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

6 个答案:

答案 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);