Я в процессе создания клиента веб-служб Java из wsdl. Я использовал Eclipses Dynamic Web Project и новый клиент веб-служб для генерации кода с помощью wsdl2java с Apache Axis 1.4. Мне нужно добавить SOAP-аутентификацию к этому коду, чтобы он работал с сервисом. Я не мог найти место, чтобы сделать это в сгенерированном коде. После обширных исследований я нашел это, которое я использовал в качестве основы для моего кода.Добавление аутентификации заголовка мыла в код сгенерированный wsdl2java
Adding ws-security to wsdl2java generated classes
Прежде чем я получаю «Ошибка произошла при обработке безопасности для сообщения» или что-то вдоль этих линий. Теперь я получаю
«Исключение: Не понял„MustUnderstand“заголовок (ы): {} http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd безопасность Сообщения: нулевое»
Я пытался много вещей, чтобы пройти это исключение. Это код, к которому я пришел сейчас.
javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName);
header.setActor(null);
header.setMustUnderstand(true);
// Add the UsernameToken element to the WS-Security header
javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken");
utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1");
javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username");
userNameElem.setValue("username");
javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password");
passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordElem.setValue("password");
header.setProcessed(true);
// Finally, attach the header to the binding.
setHeader(header)
Этот код находится в моем классе Binding_ServiceStub (в его методе createCall).
Мы создали клиентов как на C#, так и на VB с помощью этого wsdl, и там так же просто, как просто изменить переменную ClientCredentials, которая является расширением созданного класса прокси. Я надеялся на что-то подобное здесь.
Вот и политика безопасности из кода wsdl.
<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy>
Кто-нибудь знает, что еще я могу здесь сделать? Почему это исключение происходит? Я пробовал много разных комбинаций префиксов и setProcesses и setMustUnderstand значения все напрасно (и на основе моего исследования этого исключения).
И если кто-нибудь знает, как добавить аутентификацию заголовка мыла в код wsdl2java, я бы тоже принял это. Просто нужно, чтобы это работало, и вы подумали бы, что что-то вроде этого будет немного более простым или, по крайней мере, иметь больше примеров.
Обновление- Подтверждено, что тот же заголовок, переданный с использованием SOAPUI, отлично работает. Должно быть что-то с рамкой? Я создал пользовательский обработчик для обработки SOAP-сообщения, но это не помогло. Является ли Axis 1.4 и JAX-RPC проблемой? (Я знаю, что они устарели, но все еще ...)