jersey icon indicating copy to clipboard operation
jersey copied to clipboard

java.lang.NullPointerException: Cannot invoke "org.glassfish.jersey.client.ClientRequest.getPropertiesDelegate()" because the return value of "jakarta.inject.Provider.get()" is null

Open thiagohora opened this issue 1 year ago • 8 comments

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)

Screenshot 2024-08-27 at 13 10 46

thiagohora avatar Aug 27 '24 10:08 thiagohora

the most probable reason is some required dependency, which is missing from your project. Could you please list dependencies here?

senivam avatar Aug 27 '24 11:08 senivam

I just added it

thiagohora avatar Aug 27 '24 11:08 thiagohora

why is there org.glassfish.jersey.inject:jersey-hk2:3.1.8 and all other Jersey is of 3.0.12?

senivam avatar Aug 28 '24 07:08 senivam

It's a dependency of the framework I'm using. I changed it, but the result is the same.

Screenshot 2024-08-28 at 11 55 41

thiagohora avatar Aug 28 '24 09:08 thiagohora

try with hk2 (api, locator, utils) version 3.0.3 which is the default for Jersey 3.0.12.

senivam avatar Aug 28 '24 11:08 senivam

I have encountered the same issue, though with jersey 3.1.9 & Hk2 3.0.6

patrickptibco avatar Sep 18 '25 23:09 patrickptibco

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)

jbescos avatar Oct 30 '25 08:10 jbescos

It seems this is an issue related to thread locals in: NonInjectionManager$TypedInstances

jbescos avatar Oct 31 '25 08:10 jbescos