java.lang.NullPointerException: Cannot invoke "org.glassfish.jersey.client.ClientRequest.getPropertiesDelegate()" because the return value of "jakarta.inject.Provider.get()" is null
Error when using async request client
Version: 3.0.12
Code:
try (Response response = client.target(BASE_RESOURCE_URI.formatted(baseURI))
.path("items")
.path("stream")
.request()
.accept(MediaType.APPLICATION_OCTET_STREAM)
.async()
.post(Entity.json(streamRequest)).get()) {
assertThat(response.getStatus()).isEqualTo(200);
List<String> actualItems = new ArrayList<>();
try (ChunkedInput<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() {})) {
String chunk;
while ((chunk = chunkedInput.read()) != null) {
actualItems.add(chunk);
}
}
Logs:
ARN [2024-08-27 10:26:06,898] org.glassfish.jersey.internal.Errors: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 1
java.lang.NullPointerException: Cannot invoke "org.glassfish.jersey.client.ClientRequest.getPropertiesDelegate()" because the return value of "jakarta.inject.Provider.get()" is null
at org.glassfish.jersey.client.ClientBinder$PropertiesDelegateFactory.get(ClientBinder.java:69)
at org.glassfish.jersey.client.ClientBinder$PropertiesDelegateFactory.get(ClientBinder.java:58)
at org.glassfish.jersey.inject.hk2.SupplierFactoryBridge.provide(SupplierFactoryBridge.java:76)
at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:129)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:466)
at org.glassfish.jersey.inject.hk2.RequestContext.findOrCreate(RequestContext.java:59)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2109)
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:769)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:781)
at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:88)
at org.glassfish.jersey.client.ChunkedInputReader.readFrom(ChunkedInputReader.java:79)
at org.glassfish.jersey.client.ChunkedInputReader.readFrom(ChunkedInputReader.java:44)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:233)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:212)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:132)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1072)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:919)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:879)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:340)
at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:104)
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:365)
at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:244)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:101)
the most probable reason is some required dependency, which is missing from your project. Could you please list dependencies here?
I just added it
why is there org.glassfish.jersey.inject:jersey-hk2:3.1.8 and all other Jersey is of 3.0.12?
It's a dependency of the framework I'm using. I changed it, but the result is the same.
try with hk2 (api, locator, utils) version 3.0.3 which is the default for Jersey 3.0.12.
I have encountered the same issue, though with jersey 3.1.9 & Hk2 3.0.6
I am reproducing it with this test:
public class Issue5732Test extends JerseyTest {
@Override
protected Application configure() {
return new ResourceConfig(ItemResource.class);
}
@Test
void testItemStreamClient() throws Exception {
try (Response response = client().target(getBaseUri())
.path("items")
.path("stream")
.request()
.accept(MediaType.APPLICATION_OCTET_STREAM)
.async()
.post(Entity.json("test"))
.get()) {
assertEquals(200, response.getStatus());
List<String> actualItems = new ArrayList<>();
try (ChunkedInput<String> chunkedInput =
response.readEntity(new GenericType<ChunkedInput<String>>() {})) {
String chunk;
while ((chunk = chunkedInput.read()) != null) {
actualItems.add(chunk);
}
}
}
}
@Path("/items")
public static class ItemResource {
@POST
@Path("/stream")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response streamItems(String test) {
final ChunkedOutput<String> output = new ChunkedOutput<>(String.class);
Executors.newSingleThreadExecutor().submit(() -> {
try {
// Simulate streaming data in chunks
for (int i = 1; i <= 3; i++) {
output.write("item" + i + "\n");
Thread.sleep(100); // simulate delay
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (Exception ignore) {
}
}
});
return Response.ok(output).build();
}
}
}
[ERROR] org.glassfish.jersey.tests.e2e.client.Issue5732Test.testItemStreamClient -- Time elapsed: 0.679 s <<< ERROR!
java.lang.NullPointerException: Cannot invoke "org.glassfish.jersey.client.ClientRequest.getPropertiesDelegate()" because the return value of "javax.inject.Provider.get()" is null
at org.glassfish.jersey.client.ClientBinder$PropertiesDelegateFactory.get(ClientBinder.java:69)
at org.glassfish.jersey.client.ClientBinder$PropertiesDelegateFactory.get(ClientBinder.java:58)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.registerDisposableSupplierAndGet(NonInjectionManager.java:605)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.createSupplierProxyIfNeeded(NonInjectionManager.java:583)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.access$1500(NonInjectionManager.java:65)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager$ClassBindings._create(NonInjectionManager.java:914)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager$XBindings.create(NonInjectionManager.java:780)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.create(NonInjectionManager.java:423)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.getInstance(NonInjectionManager.java:355)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager$TypeBindings$1$1.get(NonInjectionManager.java:966)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.registerDisposableSupplierAndGet(NonInjectionManager.java:605)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager.access$1100(NonInjectionManager.java:65)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager$SingleRegisterSupplier.lambda$new$0(NonInjectionManager.java:596)
at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:317)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager$SingleRegisterSupplier.get(NonInjectionManager.java:600)
at org.glassfish.jersey.client.innate.inject.NonInjectionManager$TypeBindings$1.get(NonInjectionManager.java:975)
at org.glassfish.jersey.client.ChunkedInputReader.readFrom(ChunkedInputReader.java:80)
at org.glassfish.jersey.client.ChunkedInputReader.readFrom(ChunkedInputReader.java:45)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:234)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:213)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:133)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1072)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:676)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:636)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:349)
at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:104)
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:365)
at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:244)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:101)
at org.glassfish.jersey.tests.e2e.client.Issue5732Test.testItemStreamClient(Issue5732Test.java:65)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
It seems this is an issue related to thread locals in: NonInjectionManager$TypedInstances