2015-05-01 2 views
1

Tomcat 8.0.21addMessageHandler NullPointerException с лямбда

Это работает:

session.addMessageHandler(new MessageHandler.Whole<String>() { 
      @Override 
      public void onMessage(String string) { 
       try { 
        session.getBasicRemote().sendText(string); 
       } catch (IOException ex) { 
        Logger.getLogger(WebSocket.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 

Это не:

session.addMessageHandler((MessageHandler.Whole<String>) (String string) -> { 
      try { 
       session.getBasicRemote().sendText(string); 
      } catch (IOException ex) { 
       Logger.getLogger(WebSocket.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     }); 

Могу ли я считать, что это ошибка кот?

java.lang.NullPointerException 
    at org.apache.tomcat.websocket.Util.getGenericType(Util.java:192) 
    at org.apache.tomcat.websocket.Util.getGenericType(Util.java:212) 
    at org.apache.tomcat.websocket.Util.getGenericType(Util.java:212) 
    at org.apache.tomcat.websocket.Util.getMessageType(Util.java:171) 
    at org.apache.tomcat.websocket.WsSession.addMessageHandler(WsSession.java:198) 
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:138) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:696) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+0

Когда вы говорите «это не», каким образом она не работает? Какова трассировка стека? – Tavo

+0

Извините, идеальный выбор времени. – Tavo

ответ

3

Не знаю, какую версию Tomcat вы используете, но это может быть уже исправлено: https://bz.apache.org/bugzilla/show_bug.cgi?format=multiple&id=57788

Кроме того, метод, который вы вызываете использует сырые типы и не работает во всех случаях. От Tomcat Javadoc для addMessageHandler(MessageHandler):

Тип сообщения будут получены во время выполнения из предоставленного MessageHandler экземпляра. Не всегда возможно сделать это, поэтому лучше использовать addMessageHandler(Class, javax.websocket.MessageHandler.Partial) или addMessageHandler(Class, javax.websocket.MessageHandler.Whole).

Попробуйте вместо этого:

session.addMessageHandler(String.class, (String string) -> { ... }) 
+0

Обновите свою страницу – ThreaT

+1

Это исправление будет в следующей версии Tomcat (8.0.22), но, вероятно, просто изменит сообщение об ошибке - работает ли это, если вы передадите 'String.class'? – stholzm

+0

Кажется, что переключение '(MessageHandler.Whole )' для 'String.class' действительно разрешило проблему. Я буду тестировать с ** 8.0.22 **. – ThreaT

Смежные вопросы