先日書いたWebsocketでJSONデータをやり取りしたブログだけど、エラー出力をきちんとしていなくてはまった。
Decoder.Text<T>のdecodeメソッド内でExceptionが発生した場合に、明示的にログ・スタックトレースの出力をしておかないと特にスタックトレース等が出力されないでdecodeメソッド(とそれから呼ばれる@OnMessage)が終了してしまう。(コンソールにエラーがつらつら出るようなことは無い。)
そのため、下みたいな感じで明示的にエラーあったことを出力してやらないとわかりにくい。
@Override
public TestData decode(String inputString) throws DecodeException {
try{
JsonObject jsonObject = Json.createReader(new StringReader(inputString)).readObject();
return new TestData(jsonObject);
} catch(Exception e){
DecodeException de =
new DecodeException(inputString,"decode失敗", (Throwable)e);
Logger.getLogger(TestDecoder.class.getName()).log(
Level.SEVERE, null, de);
throw de;
}
}
Encoder.Text<T>のencodeメソッドも似たような話がある。
@Override
public String encode(TestData paramData) throws EncodeException {
try{
JsonObject model = Json.createObjectBuilder()
.add("message", paramData.getMessage())
.add("sessionId",paramData.getSessionId())
.add("messageTime", formatDate(paramData.getMessageTime()))
.build();
return model.toString();
} catch( Exception e ){
EncodeException ee =
new EncodeException(paramData, "encode失敗", (Throwable)e);
Logger.getLogger(TestEncoder.class.getName()).log(
Level.SEVERE, null, ee);
throw ee;
}
}
一応decodeでエラーを発生させたときのログサンプル
重大: javax.websocket.DecodeException: decode失敗 at jp.co.epea.first.json.TestDecoder.decode(TestDecoder.java:33) at jp.co.epea.first.json.TestDecoder.decode(TestDecoder.java:1) at org.glassfish.tyrus.core.EndpointWrapper.decodeCompleteMessage(EndpointWrapper.java:278) at org.glassfish.tyrus.core.SessionImpl.notifyMessageHandlers(SessionImpl.java:386) at org.glassfish.tyrus.core.EndpointWrapper.onMessage(EndpointWrapper.java:495) at org.glassfish.tyrus.server.TyrusEndpoint.onMessage(TyrusEndpoint.java:174) at org.glassfish.tyrus.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:156) at org.glassfish.tyrus.websockets.frametypes.TextFrameType.respond(TextFrameType.java:66) at org.glassfish.tyrus.websockets.DataFrame.respond(DataFrame.java:102) at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.onDataAvailable(TyrusHttpUpgradeHandler.java:113) at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.processDataAvailable(InputBuffer.java:488) at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.onDataAvailable(InputBuffer.java:453) at org.glassfish.grizzly.http.io.InputBuffer.append(InputBuffer.java:855) at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:222) at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288) at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206) at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ClassCastException: org.glassfish.json.JsonStringImpl cannot be cast to javax.json.JsonNumber at org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl.getJsonNumber(JsonObjectBuilderImpl.java:171) at jp.co.epea.first.json.TestData.<init>(TestData.java:21) at jp.co.epea.first.json.TestDecoder.decode(TestDecoder.java:30) ... 27 more