Как удалить атрибут mustunderstand из заголовка мыла в клиенте оси. Даже я не устанавливаю его специально, когда я устанавливаю информацию о заголовке мыла mustundertand, а атрибуты актера автоматически добавляются в сообщение мыла. Кто-нибудь знает, как их удалить? Я использую wsdl2java версии Axis2 1.4 для создания моего клиента ws.
удаление атрибута mustUnderstand из заголовков мыла
Ответы:
Ни одно из этих решений не сработало для меня, так как:
- Я работаю с Axis (не Axis2)
- Я вообще не хочу, чтобы этот атрибут указывался, так как мой аналог на сервере его не поддерживает ("https://schemas.xmlsoap.org/soap/envelope/:mustUnderstand «атрибут не объявлен» — типичный ответ в таком случае).
Глядя на ответ на "Добавление ws-security в сгенерированные классы wsdl2java" помог мне написать решение, которое сработало для меня:
void addSecurityHeader(Stub stub, final String username, final String password) {
QName headerName = new QName("https://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));
то MustUnderstandChecker клиента AXIS никогда не вызывается.
В моем случае сработало удаление атрибута из 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 значение false?
2) Поскольку вы создаете свой клиент с помощью wsdl2java, вполне возможно, что WSDL (или, точнее, схема) содержит атрибут mustUnderstand для элемента, на который ссылается ваша привязка SOAP. Поэтому, когда wsdlToJava генерирует клиентский код, эти атрибуты будут добавлены естественным образом. См. здесь описание атрибут mustUnderstand. Если об изменении WSDL не может быть и речи, и вы должны удалить этот атрибут из заголовка, то я полагаю, вы можете попробовать сделать это с помощью обработчика
3) Не рекомендуется, но если вы действительно ДОЛЖНЫ удалить этот атрибут, я полагаю, вы можете добавить обработчик на стороне клиента, который изменяет заголовок: https://ws.apache.org/axis/java/apiDocs/org/apache/axis/handlers/package-summary.html а>
я использую клиент оси 1.4 с безопасностью ws
в моем случае, как сказал Рейнхард, это сработало
MyService service = new MyServiceLocator();
MyServicePortType port = service.getMyServiceHttpsSoap11Endpoint();
((Stub) port)._setProperty(Call.CHECK_MUST_UNDERSTAND, Boolean.FALSE);