From a78ec153253e83296c1d6d55b0e5ab18affb0ce0 Mon Sep 17 00:00:00 2001 From: Brett Kail Date: Fri, 23 Mar 2018 06:59:55 -0500 Subject: [PATCH] Fix Netty uncaught exception handling The servlet ResponseWriter.failure rethrows exceptions so that they are logged, but the Netty version does not, which means exceptions thrown from service handlers are not logged. --- .../netty/httpserver/NettyResponseWriter.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java index 19de6c171f..b145caaa04 100644 --- a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java +++ b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyResponseWriter.java @@ -200,8 +200,27 @@ public void commit() { @Override public void failure(Throwable error) { - ctx.writeAndFlush(new DefaultFullHttpResponse(req.protocolVersion(), HttpResponseStatus.INTERNAL_SERVER_ERROR)) - .addListener(ChannelFutureListener.CLOSE); + try { + ctx.writeAndFlush(new DefaultFullHttpResponse(req.protocolVersion(), HttpResponseStatus.INTERNAL_SERVER_ERROR)) + .addListener(ChannelFutureListener.CLOSE); + } catch (Throwable t) { + error.addSuppressed(t); + } finally { + rethrow(error); + } + } + + /** + * Rethrow the original exception as required by JAX-RS, 3.3.4 + * + * @param error throwable to be re-thrown + */ + private void rethrow(Throwable error) { + if (error instanceof RuntimeException) { + throw (RuntimeException) error; + } else { + throw new ContainerException(error); + } } @Override