2016-09-11 6 views
1

コンテナに依存しないWebsocketサーバーを作成しています。私の開発環境では、Jettyバージョン9.3.11.v20160721(埋め込みコード)が埋め込まれたIntelliJ IDEAが使用されています。コンテナにとらわれないWebsocketが埋め込みJettyでNPEを投げる

私のコードでは、tomcat-websocket-apitomcat-websocketのバージョン8.5.4というTomcat Websocketライブラリが使用されています。

ウェブソケットEndPointServletContextListenerに登録したいと思います。 Tyrus projectのいくつかの例に加えて、SOとJoakim Erdfelt(@ joakim-erdfelt)のJettyメーリングリストのいくつかの回答と同様に、私は次の実装を書いてlistenerweb.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.tempdirorg.eclipse.jetty.util.DecoratedObjectFactoryorg.eclipse.jetty.tldsorg.eclipse.jetty.resourcesorg.eclipse.jetty.server.Executororg.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(); 

答えて

2

JSR ServerContainerが埋め込ま、突堤に自動的に初期化されていません。

使用はWebSocketServerContainerInitializer ...

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); 

// Add this line 
WebSocketServerContainerInitializer.configureContext(webapp); 

server.start(); 
server.join(); 

注:WebSocketServerContainerInitializerjavax.servlet.ServerContainerInitializerであり、あなたは自動的にServerContainerInitializerことを実行するために、あなたのembedded-jettyを設定することができます。

注釈のバイトコードスキャンに大きく依存している場合や、javax.websocket.server.ServerApplicationConfigの実装を使用している場合は、ServerContainerInitializerを自動的に実行する必要があります。

注:javax.servlet.ServerContainerInitializerは、org.eclipse.jetty.webapp.WebAppContextにのみ有効です。

org.eclipse.jetty.servlet.ServletContextHandler(埋め込み桟橋で一般的なフォーム)を使用する場合は、javax.servlet.ServerContainerInitializerを使用できません。

それを設定するには、このです:

private void enableAnnotationScanning(Server server) 
{ 
    Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server); 
    classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", 
      "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
      "org.eclipse.jetty.plus.webapp.PlusConfiguration"); 
    classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", 
      "org.eclipse.jetty.annotations.AnnotationConfiguration"); 
} 

// ... later on ... 

Server server = new Server(); 
enableAnnotationScanning(server); 
+0

は即答をいただき、ありがとうございます。したがって、これは厳密には埋め込みの問題であり、標準のサーブレットコンテナにデプロイしたときには発生しないはずです。 – isapir

+0

この行を追加すると、別のNPEを早期にスローします。 '例外" main "java.lang.NullPointerException ターゲットVMとの接続が切断されました。アドレス: '127.0.0.1:50113'、トランスポート: 'socket' \t at org.eclipseプロパティjava:100) ' – isapir

+0

私はあなたの答えを更新しました。 'server.setHandler(webapp)'の後に行を移動しなければならず、両方のNPEが修正されました。ありがとう! – isapir

関連する問題