2

この質問の延長があります。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」を返すので、それが機能していると思います。

これを修正するにはどうすればよいですか?

編集:この修正を試みましたが、役に立ちませんでした。

代わりに @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, 
 ...
 ...

値のリストには、MessageContext.SERVLET_REQUEST の値である javax.xml.ws.servlet.request が含まれていません。MessageContext にこの値があることを確認するにはどうすればよいですか?

4

2 に答える 2

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 アドレス、ポートなどを取得できます。

于 2013-03-05T19:49:29.993 に答える
2

現在、Jetty HTTP SPI JAX-WS 実装は、Web サービスに MessageContext を正しく挿入していないようです。代わりに Apache CXF に切り替えてみてください。持ったら

  1. cxf-2.6.2.jar
  2. neethi-3.0.2.jar
  3. xmlschema-core-2.0.3.jar

プロジェクトのビルド パスで、CXFNonSpringServlet を拡張し、次のように 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();
于 2012-09-25T20:23:41.240 に答える