Jakarta ee 将参数从EJB传递到SOAP处理程序解析器

Jakarta ee 将参数从EJB传递到SOAP处理程序解析器,jakarta-ee,jax-ws,Jakarta Ee,Jax Ws,我无法将参数从应用程序传递给处理程序。 在EJB中,我将我的Web服务称为: MyNameWSService service = new MyNameWSService(URL); //MyNameWSService = class with annotation @WebServiceClient ((BindingProvider)service.getMyNameWSPort()).getRequestContext().put("login", login); HeaderHandler

我无法将参数从应用程序传递给处理程序。 在EJB中,我将我的Web服务称为:

MyNameWSService service = new MyNameWSService(URL); //MyNameWSService = class with annotation @WebServiceClient
((BindingProvider)service.getMyNameWSPort()).getRequestContext().put("login", login);
HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();
service.setHandlerResolver(handlerResolver);
service.getMyNameWSPort().callMyMethod();
在HeaderHandlerResolver中,我尝试读取参数“login”,但它为空:

import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {
   public boolean handleMessage(SOAPMessageContext smc) {
     ...
     System.out.println(smc.get("login")); //it's null, why?
   }
...
import javax.xml.ws.handler.soap.SOAPHandler;
导入javax.xml.ws.handler.soap.SOAPMessageContext;
公共类HeaderHandler实现SOAPHandler{
公共布尔handleMessage(SOAPMessageContext smc){
...
System.out.println(smc.get(“login”);//它是空的,为什么?
}
...
}

我创建HeaderHandlerResolver是为了将WS-Security头添加到soap请求中,登录名/密码可能不同

import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;

public class HeaderHandlerResolver implements HandlerResolver {

public List<Handler> getHandlerChain(PortInfo portInfo) {
      List<Handler> handlerChain = new ArrayList<Handler>();
      HeaderHandler hh = new HeaderHandler();
      handlerChain.add(hh);
      return handlerChain;
   }
}
import javax.xml.ws.handler.handler;
导入javax.xml.ws.handler.HandlerResolver;
导入javax.xml.ws.handler.PortInfo;
公共类HeaderHandlerResolver实现HandlerResolver{
公共列表getHandlerChain(PortInfo PortInfo){
List handlerChain=new ArrayList();
HeaderHandler hh=新HeaderHandler();
扶手链。添加(hh);
返回手柄链;
}
}

这对您不起作用,因为每次调用
service.getMyNameWSPort()
都会得到一个新的代理

你叫它两次:

  • 一次,设置请求上下文值
  • 再次调用web服务

  • 您用于调用web服务的第二个代理尚未使用您的
    登录
    对象更新其请求上下文。

    好的,谢谢,我重写了代码,它开始工作了:

    MyNameWSService service = new MyNameWSService(URL); //MyNameWSService = class with annotation @WebServiceClient
    MyNameWSPort servicePort = service.getMyNameWSPort()
    ((BindingProvider)servicePort).getRequestContext().put("login", login);
    
    HeaderHandlerResolver handlerResolver = new HeaderHandlerResolver();
    service.setHandlerResolver(handlerResolver);
    servicePort.callMyMethod();
    

    您的
    HeaderHandlerResolver
    是否同时实现和?也许您可以展示更多的实现…HeaderHandlerResolver的代码被添加到Post中您如何知道调用
    …getRequestContext().put(“login”,login)
    ?login参数的值不为空。这并不能回答问题。。。