在码头wsContext.getMessageContext()得到(MessageContext.

2019-09-22 16:48发布

我有一个扩展了这个问题 。 我有一个码头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的有这个价值?

Answer 1:

目前,该码头的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

你的项目构建路径上,你必须创建一个扩展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();


Answer 2:

我遇到了同样的问题 - 而不是检索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?