我有this question的扩展名。我在 Jetty 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”,所以我认为这是有效的。
我该怎么做才能解决这个问题?
编辑: 我试过this修复无济于事。
我也尝试过使用@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具有此值?
答案 0 :(得分:2)
目前,Jetty HTTP SPI JAX-WS实现似乎没有将MessageContext正确地注入Web服务。尝试切换到Apache CXF。一旦你有了
在项目构建路径上,您必须创建一个扩展CXFNonSpringServlet的servlet类,并覆盖loadBus函数,如下所示:
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();
答案 1 :(得分:2)
我遇到了同样的问题 - 我没有像那样检索SERVLET_REQUEST并获取null,而是使用了以下内容:
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地址,端口等