wsContext.getMessageContext()。get(MessageContext.SERVLET_REQUEST)在Jetty上返回null?

时间:2012-09-20 19:23:00

标签: java soap jetty jax-ws

我有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具有此值?

2 个答案:

答案 0 :(得分:2)

目前,Jetty HTTP SPI JAX-WS实现似乎没有将MessageContext正确地注入Web服务。尝试切换到Apache CXF。一旦你有了

  1. CXF-2.6.2.jar
  2. neethi-3.0.2.jar
  3. XMLSchema的芯 - 2.0.3.jar
  4. 在项目构建路径上,您必须创建一个扩展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地址,端口等