как добавить заголовки контекста сообщения в ось apache 2 Java

Я работаю над веб-сервисами. Я хочу знать, как добавить заголовки в запрос SOAP в веб-службах типа JAX-WS.

Считайте мой заголовок таким.

    Map<String, List<String>> headers = new HashMap<String, List<String>>();
    headers.put("Username", Collections.singletonList("aaaa"));
    headers.put("Password", Collections.singletonList("aaaa"));

У меня есть объект-заглушка в моем клиентском классе. Я использую Apache Axis 2. Все классы создаются автоматически.

SimpleSTub stub = new Simplestub();

Я хочу добавить эту информацию заголовка в client.

MessageContext.HTTP_REQUEST_HEADERS, headers

Изменить

Фактическая реализация в нормальном классе находится как

закрытая статическая конечная строка WS_URL = "http: // localhost: 9999 / ws / hello? wsdl";

public static void main (String [] args) выдает исключение {

URL url = новый URL (WS_URL); QName qname = new QName ("http://ws.mkyong.com/", "HelloWorldImplService");

Service service = Service.create(url, qname);
HelloWorld hello = service.getPort(HelloWorld.class);

/*******************UserName & Password ******************************/
Map<String, Object> req_ctx = ((BindingProvider)hello).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);

Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList("mkyong"));
headers.put("Password", Collections.singletonList("password"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
/**********************************************************************/

System.out.println(hello.getHelloWorldAsString());

Кто-нибудь может сказать, как этого добиться.

Спасибо.


person Patan    schedule 09.01.2013    source источник


Ответы (1)


Вы вроде как на пути к решению с тем, что у вас уже есть. Самый простой способ добиться этого -

  1. В коде клиента получите ссылку на MessageContext через BindingProvider на SimpleStub

    Map<String,Object> context = ((BindingProvder)stub).getRequestContext()
    Map<String,List> headers = context.get(MessageContext.HTTP_REQUEST_HEADERS)
    
  2. Обновите карту и вставьте ее обратно в объект контекста запроса

    context.put(MessageContext.HTTP_REQUEST_HEADERS,headers)
    

    Вышесказанное - это хорошо. Если, однако, вы пытаетесь сделать то, что я предполагаю, это добавить параметры аутентификации, рекомендуемый способ:

    context.put(BindingProvder.USERNAME_PROPERTY,"username");
    context.put(BindingProvder.PASSWORD_PROPERTY,"password");   
    
person kolossus    schedule 09.01.2013
comment
Спасибо за решение. Было бы здорово, если бы вы могли сказать мне, как получить к нему доступ также и в классе обслуживания. - person Patan; 10.01.2013
comment
@ User222, посмотрите этот ответ и просто замените ответ запросами. Однако есть и другие способы сделать это в служебном компоненте. Если приведенный выше ответ решает проблему, не забудьте принять его. - person kolossus; 10.01.2013
comment
Я получаю исключение, поскольку тип заглушки нельзя преобразовать в BindingPort. Я отредактировал вопрос. Пожалуйста, проверьте. - person Patan; 10.01.2013
comment
Еще раз спасибо за ответ. Думаю, нужно заменить заглушку переменной hello. Но как получить из стаба не знаю. - person Patan; 10.01.2013
comment
@ User222, я немного запуталась. В какой именно момент вы находитесь в этом развитии? Удалось ли вам вообще общаться с веб-службой? Отредактированный код, который вы внесли в свой вопрос, вы действительно выполнили его, и он работает? - person kolossus; 10.01.2013
comment
Я разработал веб-сервис без аутентификации. Он работает нормально. Я могу получить результат. Но я не понимаю, как добавить аутентификацию в Axis2. - person Patan; 10.01.2013
comment
@ User222 Значит, защита веб-службы - это конкретное требование? Вам нужно будет опубликовать новый вопрос с подробным описанием того, что, я боюсь, ответ на это требование не будет иметь смысла в данном контексте. - person kolossus; 10.01.2013
comment
@kolossus благодарит за решение; тем не менее, я застрял с заглушкой приведения к обязательному провайдеру. и я тоже использую Axis2. (выдается исключение, в котором говорится, что моя заглушка не может быть преобразована в javax.xml.ws.BindingProvider. Это дополнительный шаг в создании заглушки с помощью Axis2? Спасибо. - person Gary Tsui; 06.02.2014