удаление атрибута mustUnderstand из мыльных заголовков - PullRequest
3 голосов
/ 19 сентября 2011

Как удалить атрибут mustunderstand из заголовка soap в оси client. Даже если я не устанавливаю его, особенно, когда задаю информацию заголовка soap, mustundtand, и атрибуты актера автоматически добавляются в сообщение soap. Кто-нибудь знает, как их удалить? Я использую wsdl2java версии Axis2 1.4 для создания своего ws-клиента.

Ответы [ 6 ]

6 голосов
/ 11 апреля 2013

Ни одно из этих решений не работало для меня, как:

  • Я работаю с 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
}
6 голосов
/ 02 августа 2012

Если вы хотите отключить обязательную проверку в клиенте AXIS, вам необходимо добавить в свой код следующую строку:

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

, тогда MustUnderstandChecker клиента AXISникогда не вызывается.

2 голосов
/ 20 августа 2014

В моем случае сработало удаление атрибута из 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 голос
/ 10 апреля 2013

Недавно я боролся с подобной ситуацией, и, поработав над Google, мне удалось найти следующее решение.

Используя 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); где-то в вашем коде.

0 голосов
/ 28 января 2013

я использую клиент оси 1.4 с защитой ws

в моем случае, как сказал Рейнхард это сработало

MyService service = new MyServiceLocator(); 
MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint();

((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);
0 голосов
/ 19 сентября 2011

1) Используете ли вы SOAPHeaderElement Axis, и если да, задаете ли для параметра установки mustUnderstand значение false?

2) Поскольку вы генерируете свой клиент с помощью wsdl2java, вполне возможно, что WSDL (или, точнее, схема) содержит атрибут mustUnderstand элемента, на который ссылается ваша привязка SOAP. Поэтому, когда wsdlToJava генерирует клиентский код, эти атрибуты будут естественно добавлены. См. здесь для описания атрибута mustUnderstand. Если об изменении WSDL не может быть и вы должны удалить этот атрибут из заголовка, то я полагаю, вы можете попытаться сделать это с помощью обработчика

3) Не рекомендуется, но если вы действительно ДОЛЖНЫ удалить этот атрибут, то, я полагаю, вы можете добавить обработчик на стороне клиента, который изменяет заголовок: http://ws.apache.org/axis/java/apiDocs/org/apache/axis/handlers/package-summary.html

...