我有一个扩展了这个问题 。 我有一个码头Server上运行的确切的代码,以及其他SOAP Web服务很好地工作。 然而,在这条线:
HttpServletRequest req = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
System.out.println("Client IP = " + req.getRemoteAddr());
服务器用一个空指针异常崩溃。 mc.get(MessageContext.SERVLET_REQUEST)
将返回NULL。
相比之下, mc.get(MessageContext.HTTP_REQUEST_METHOD
)返回“POST”,所以我假定的工作。
我能做些什么来解决这个问题?
编辑:我试过这个修复无济于事。
我已经使用@Context注解来替代也试过,得到了相同的问题。
甲的System.out.println(MC)产生这样的:
{javax.xml.ws.wsdl.port={http://my.test.namespace.com/}testWSDLPort,
javax.xml.ws.soap.http.soapaction.uri="",
com.sun.xml.internal.ws.server.OneWayOperation=null,
javax.xml.ws.http.request.pathinfo=null,
...
...
等等,和值的列表中不包括javax.xml.ws.servlet.request,这是MessageContext.SERVLET_REQUEST的价值。 我需要做什么做的,以确保MessageContext的有这个价值?
目前,该码头的HTTP SPI JAX-WS实现不出现在MessageContext的适当注入到一个Web服务。 尝试切换到Apache CXF来代替。 一旦你有
- CXF-2.6.2.jar
- neethi-3.0.2.jar
- XMLSchema的核心2.0.3.jar
你的项目构建路径上,你必须创建一个扩展CXFNonSpringServlet并覆盖loadBus功能,像这样一个servlet类:
public class SOAPServlet extends CXFNonSpringServlet {
private static final long serialVersionUID = 1L;
private Map<String, Object> endpoints;
public SOAPServlet(){
endpoints = new HashMap<String, Object>();
}
@Override
public void loadBus(ServletConfig servletConfig) {
super.loadBus(servletConfig);
// You could add the endpoint publish codes here
Bus bus = getBus();
BusFactory.setDefaultBus(bus);
Set s = endpoints.entrySet();
Iterator p = s.iterator();
while(p.hasNext()){
Map.Entry m = (Map.Entry)p.next();
String address = (String)m.getKey();
Object impl = (Object)m.getValue();
System.out.println("Publishing " + address);
Endpoint.publish(address, impl);
}
}
public void publish(String address, Object impl){
endpoints.put(address, impl);
}
}
然后你在哪里配置服务器,添加这些行:
Server server = new Server(8080);
// Configure SOAP servlet
SOAPServlet servlet = new SOAPServlet();
ServletHolder SOAPServletHolder = new ServletHolder(servlet);
ServletContextHandler SOAPContext = new ServletContextHandler(server,"/",ServletContextHandler.SESSIONS);
SOAPContext.addServlet(SOAPServletHolder, "/*");
// Set server context handlers
ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler []{SOAPContext});
server.setHandler(contexts);
// Publish SOAP Web service endpoints
servlet.publish("/MyWebServiceRelativeURL", new MyWebServiceImpl());
server.start();
server.join();
我遇到了同样的问题 - 而不是检索SERVLET_REQUEST这样的,越来越空,我用了以下内容:
com.sun.net.httpserver.HttpExchange server = (com.sun.net.httpserver.HttpExchange) mc.get("com.sun.xml.internal.ws.http.exchange");
System.out.println("Client IP = " + server.getRemoteAddress().toString());
这使得检索的IP地址,端口等。
文章来源: wsContext.getMessageContext().get(MessageContext.SERVLET_REQUEST) returns null on Jetty?