2014-02-17 7 views
3

Я в процессе создания клиента веб-служб 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 проблемой? (Я знаю, что они устарели, но все еще ...)

ответ

4

Прохладный. Я решил просто использовать Apache CXF в моей рамках и с помощью этого столь же легко, как добавление

javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider) port; 
    bp.getRequestContext().put("ws-security.username", username); 
    bp.getRequestContext().put("ws-security.password", password); 

Wow, что гораздо лучше. Не используйте извлеченный урок Axis 1.4.

 Смежные вопросы

  • Нет связанных вопросов^_^