web-dev-qa-db-fra.com

Exception RESTEasy: RESTEASY003770: La réponse est validée, impossible de gérer une exception

Je reçois une étrange exception de mon serveur RESTEasy. Cela se produit lorsqu'une réponse particulièrement volumineuse est renvoyée au client.

L'exception se produit après que mon code a renvoyé l'objet de résultat à RESTEasy, de sorte que tout se trouve dans la couche RESTEasy. Le serveur est Tomcat.

Les petites réponses sont acceptables, mais les grandes déclenchent l'erreur. Cela se produit si je retourne du JSON ou du XML et que la taille de la réponse déclenche le déclenchement, pas le contenu des objets que je retourne.

J'ai cherché autour de moi, mais je n'ai encore rien trouvé d'utile, et je suis à peu près perdue à ce stade ....

org.jboss.resteasy.spi.UnhandledException: RESTEASY003770: Response is committed, can't handle exception
        at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.Java:174)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.Java:478)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:422)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.Java:209)
        at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.Java:221)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:56)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.Java:51)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:729)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:292)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:207)
        at org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:240)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:207)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:212)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:106)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:141)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:79)
        at org.Apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.Java:616)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:88)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:522)
        at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1095)
        at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:672)
        at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1502)
        at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1458)
        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)
Caused by: org.Apache.catalina.connector.ClientAbortException: Java.io.IOException: Broken pipe
        at org.Apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.Java:393)
        at org.Apache.Tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.Java:426)
        at org.Apache.Tomcat.util.buf.ByteChunk.append(ByteChunk.Java:339)
        at org.Apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.Java:418)
        at org.Apache.catalina.connector.OutputBuffer.write(OutputBuffer.Java:406)
        at org.Apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.Java:97)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.write(HttpServletResponseWrapper.Java:46)
        at org.jboss.resteasy.util.CommitHeaderOutputStream.write(CommitHeaderOutputStream.Java:71)
        at org.jboss.resteasy.util.DelegatingOutputStream.write(DelegatingOutputStream.Java:48)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.Java:2003)
        at com.fasterxml.jackson.core.json.UTF8JsonGenerator.close(UTF8JsonGenerator.Java:1049)
        at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.writeTo(ResteasyJackson2Provider.Java:209)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.Java:131)
        at org.jboss.resteasy.core.interception.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.Java:60)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.Java:120)
        at org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.Java:100)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.Java:124)
        at org.jboss.resteasy.plugins.interceptors.encoding.ServerContentEncodingAnnotationFilter.aroundWriteTo(ServerContentEncodingAnnotationFilter.Java:60)
        at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.Java:124)
        at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.Java:98)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.Java:473)
        ... 27 more
Caused by: Java.io.IOException: Broken pipe
        at Sun.nio.ch.FileDispatcherImpl.write0(Native Method)
        at Sun.nio.ch.SocketDispatcher.write(SocketDispatcher.Java:47)
        at Sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.Java:93)
        at Sun.nio.ch.IOUtil.write(IOUtil.Java:65)
        at Sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.Java:471)
        at org.Apache.Tomcat.util.net.NioChannel.write(NioChannel.Java:124)
        at org.Apache.Tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.Java:101)
        at org.Apache.Tomcat.util.net.NioSelectorPool.write(NioSelectorPool.Java:172)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.Java:139)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.flushBuffer(InternalNioOutputBuffer.Java:244)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.Java:189)
        at org.Apache.coyote.http11.InternalNioOutputBuffer.access$000(InternalNioOutputBuffer.Java:41)
        at org.Apache.coyote.http11.InternalNioOutputBuffer$SocketOutputBuffer.doWrite(InternalNioOutputBuffer.Java:320)
        at org.Apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.Java:93)
        at org.Apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.Java:256)
        at org.Apache.coyote.Response.doWrite(Response.Java:501)
        at org.Apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.Java:388)
        ... 47 more

Mise à jour: J'ai effectivement eu cela se reproduire! La réponse de Scott ci-dessous couvrait le premier cas, mais la deuxième fois était due à l'insertion d'une valeur nulle pour un en-tête de réponse. RESTEasy a accepté la valeur d'en-tête NULL au moment où je l'ai inséré, mais a ensuite explosé lorsqu'il a tenté de sérialiser la réponse après avoir quitté le code.

6
Roy Wood

Ok, après avoir vécu cela à quelques reprises - j’ai personnellement observé ce comportement en cas de problème avec le proxy inverse frontal si vous en utilisez un. Par exemple, j'ai rencontré des problèmes lors de l'utilisation de nginx dans lequel le système était déployé et exécuté avec différents utilisateurs. Un problème d'autorisation sur des répertoires temporaires signifie que vous ne pourrez peut-être pas le voir avant que la réponse atteigne une certaine taille. Par exemple (c'est une ligne, les sauts de ligne servent à la visibilité):

2017-04-20T17:46:40.03987 [nginx] 2017/04/20 13:46:40 [crit] 64537#0: 
  *14195 open() "/usr/local/var/run/nginx/proxy_temp/6/43/0000000436" 
  failed (13: Permission denied) while reading upstream, client: 10.0.0.1, 
  server: foo.bar.com, request: "GET /this/awesome/endpoint HTTP/1.1", 
  upstream: "http://127.0.0.1:9999/this/awesome/endpoint", Host: "foo.bar.com"
4
Scott Corscadden
Caused by: org.Apache.catalina.connector.ClientAbortException: Java.io.IOException: Broken pipe

Il semble que le client ferme la connexion avant que la réponse ne soit complètement envoyée. Pouvez-vous augmenter le délai d'attente du client, puis vérifier 

1
gladiator