-
Notifications
You must be signed in to change notification settings - Fork 368
Description
Hi everyone,
I encountered an issue when aborting a request via ClientRequestContext#abortWith with a Response containing a GenericEntity.
When attempting to serialize the entity in ClientResponse, null is passed as the type parameter, making any MessageBodyWriter that relies on the genericType parameter return false from isWriteable or throw a NullPointerException, depending on how the parameter is accessed.
From looking at it in the debugger, the generic type information seems to be available at that point, either from casting the response parameter
to an OutboundJaxrsResponse and calling .getContext().getEntityType() on it, or from calling the same methods the OutboundJaxrsResponse created here.
Jersey version: 3.1.10
Java version: 21
Reproducer: https://github.com/Sola-ris/jersey-abort-with-generic-entity-reproducer
Run reproducer ./mvnw clean test
Error log
Jan 24, 2025 10:08:33 PM org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo SEVERE: MessageBodyWriter not found for media type=text/csv, type=class java.util.Arrays$ArrayList, genericType=null.
Stacktrace
jakarta.ws.rs.client.ResponseProcessingException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=text/csv, type=class java.util.Arrays$ArrayList, genericType=null. at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:762) at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$1(JerseyInvocation.java:687) at org.glassfish.jersey.client.JerseyInvocation.call(JerseyInvocation.java:709) at org.glassfish.jersey.client.JerseyInvocation.lambda$runInScope$3(JerseyInvocation.java:703) at org.glassfish.jersey.internal.Errors.process(Errors.java:292) at org.glassfish.jersey.internal.Errors.process(Errors.java:274) at org.glassfish.jersey.internal.Errors.process(Errors.java:205) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:391) at org.glassfish.jersey.client.JerseyInvocation.runInScope(JerseyInvocation.java:703) at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:686) at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:422) at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:318) at org.example.ReproducerTest.testAbortRequestAndReadGenericEntity(ReproducerTest.java:45) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=text/csv, type=class java.util.Arrays$ArrayList, genericType=null. at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:224) at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139) at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1116) at org.glassfish.jersey.client.ClientResponse$1.read(ClientResponse.java:81) at java.base/java.io.InputStream.read(InputStream.java:287) at org.glassfish.jersey.innate.io.InputStreamWrapper.read(InputStreamWrapper.java:55) at org.glassfish.jersey.innate.io.InputStreamWrapper.read(InputStreamWrapper.java:55) at org.glassfish.jersey.message.internal.ReaderWriter.readAllBytes(ReaderWriter.java:210) at org.glassfish.jersey.message.internal.ReaderWriter.readFromAsString(ReaderWriter.java:167) at org.glassfish.jersey.message.internal.StringMessageProvider.readFrom(StringMessageProvider.java:54) at org.glassfish.jersey.message.internal.StringMessageProvider.readFrom(StringMessageProvider.java:36) at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:236) at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:215) at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:135) at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1072) at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:657) at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:591) at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:298) at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:757) ... 15 more