コンテナに依存しないWebsocketサーバーを作成しています。私の開発環境では、Jettyバージョン9.3.11.v20160721
(埋め込みコード)が埋め込まれたIntelliJ IDEAが使用されています。コンテナにとらわれないWebsocketが埋め込みJettyでNPEを投げる
私のコードでは、tomcat-websocket-api
とtomcat-websocket
のバージョン8.5.4
というTomcat Websocketライブラリが使用されています。
ウェブソケットEndPoint
をServletContextListener
に登録したいと思います。 Tyrus projectのいくつかの例に加えて、SOとJoakim Erdfelt(@ joakim-erdfelt)のJettyメーリングリストのいくつかの回答と同様に、私は次の実装を書いてlistener
web.xml
で追加しました。
コードがcontextInitialized()
メソッドに入っているため、一部が正しく動作しているようですが、残念ながらServletContextには属性javax.websocket.server.ServerContainer
が含まれていないため、nullが返されます。
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
final ServerContainer serverContainer = (ServerContainer) servletContextEvent
.getServletContext()
.getAttribute("javax.websocket.server.ServerContainer");
// *** serverContainer is null ***
try {
serverContainer.addEndpoint(ChatAnnotation.class);
}
catch (DeploymentException e) { e.printStackTrace(); }
}
のみ使用可能な属性は、私が間違って何をjavax.servlet.context.tempdir
、org.eclipse.jetty.util.DecoratedObjectFactory
、org.eclipse.jetty.tlds
、org.eclipse.jetty.resources
、org.eclipse.jetty.server.Executor
、org.eclipse.jetty.webFragments
をやっていますか?これは厳密に埋め込み問題ですか?標準のJetty(つまり、埋め込まれていない)で正常に動作しますか?
埋め込みコードは、以下である:
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setResourceBase(webroot);
webapp.setDescriptor(webroot + "/WEB-INF/web.xml");
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.setConnectors(new ServerConnector[] { connector });
server.setHandler(webapp);
server.start();
server.join();
は即答をいただき、ありがとうございます。したがって、これは厳密には埋め込みの問題であり、標準のサーブレットコンテナにデプロイしたときには発生しないはずです。 – isapir
この行を追加すると、別のNPEを早期にスローします。 '例外" main "java.lang.NullPointerException ターゲットVMとの接続が切断されました。アドレス: '127.0.0.1:50113'、トランスポート: 'socket' \t at org.eclipseプロパティjava:100) ' – isapir
私はあなたの答えを更新しました。 'server.setHandler(webapp)'の後に行を移動しなければならず、両方のNPEが修正されました。ありがとう! – isapir