【问题标题】:wsContext.getMessageContext().get(MessageContext.SERVLET_REQUEST) returns null on Jetty?wsContext.getMessageContext().get(MessageContext.SERVLET_REQUEST) 在 Jetty 上返回 null?
【发布时间】:2012-09-20 19:23:00
【问题描述】:

我有一个this question 的分机号。我在 Jetty Server 上运行了准确的代码,而其他 SOAP 网络服务也可以完美运行。但是,在这一行:

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

【问题讨论】:

    标签: java soap jetty jax-ws


    【解决方案1】:

    目前,Jetty HTTP SPI JAX-WS 实现似乎无法将 MessageContext 正确地注入 Web 服务。尝试改用 Apache CXF。一旦你有

    1. cxf-2.6.2.jar
    2. neethi-3.0.2.jar
    3. xmlschema-core-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();
    

    【讨论】:

      【解决方案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 地址、端口等。

      【讨论】:

      • 不幸的是,我无法再访问此代码,否则我将进行测试,希望这对某人有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-29
      • 1970-01-01
      • 2014-11-09
      • 2021-02-10
      • 1970-01-01
      相关资源
      最近更新 更多