将参数从 EJB 传递到 SOAP 处理程序解析器
Passing parameter from the EJB to the SOAP Handler Resolver
我无法将参数从应用程序传递到处理程序。
在 EJB 中,我调用我的网络服务:
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?
}
...
}
我创建 HeaderHandlerResolver 是为了将 WS-Security Header 添加到 soap 请求,login/password 可能不同。
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;
}
}
这对您不起作用,因为每次调用 service.getMyNameWSPort()
都会得到一个新代理。
您调用了两次:
- 一次设置请求上下文值
- 然后再次调用网络服务
您用来调用 Web 服务的第二个代理尚未使用您的 login
对象更新其请求上下文。
好的,谢谢,我重写了我的代码,它开始工作了:
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();
我无法将参数从应用程序传递到处理程序。 在 EJB 中,我调用我的网络服务:
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?
}
...
}
我创建 HeaderHandlerResolver 是为了将 WS-Security Header 添加到 soap 请求,login/password 可能不同。
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;
}
}
这对您不起作用,因为每次调用 service.getMyNameWSPort()
都会得到一个新代理。
您调用了两次:
- 一次设置请求上下文值
- 然后再次调用网络服务
您用来调用 Web 服务的第二个代理尚未使用您的 login
对象更新其请求上下文。
好的,谢谢,我重写了我的代码,它开始工作了:
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();