如何将消息上下文头添加到apache axis 2 Java

Pat*_*tan 3 java axis2 web-services jax-ws webservice-client

我正在从事网络服务.我想知道如何在JAX-WS类型的Web服务中向SOAP请求添加标头.

考虑我的头像这样.

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

我的客户端类中有stub对象.我正在使用Apache Axis 2.所有类都是自动生成的.

SimpleSTub stub = new Simplestub();
Run Code Online (Sandbox Code Playgroud)

我想在客户端添加此标头信息.

MessageContext.HTTP_REQUEST_HEADERS, headers
Run Code Online (Sandbox Code Playgroud)

编辑

在普通类中的实际实现发现为

private static final String WS_URL ="http:// localhost:9999/ws/hello?wsdl";

public static void main(String [] args)throws Exception {

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());
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉如何实现这一目标.

谢谢.

kol*_*sus 12

您已经拥有了已有的解决方案.实现这一目标的最基本方法是

  1. 在您的客户端代码,获取参考MessageContext通过BindingProvider你的SimpleStub

    Map<String,Object> context = ((BindingProvder)stub).getRequestContext()
    Map<String,List> headers = context.get(MessageContext.HTTP_REQUEST_HEADERS)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更新地图并将其填充到请求上下文对象中

    context.put(MessageContext.HTTP_REQUEST_HEADERS,headers)
    
    Run Code Online (Sandbox Code Playgroud)

    以上都很好.但是,如果您尝试执行我认为添加身份验证参数的操作,建议的方法是

    context.put(BindingProvder.USERNAME_PROPERTY,"username");
    context.put(BindingProvder.PASSWORD_PROPERTY,"password");   
    
    Run Code Online (Sandbox Code Playgroud)