Migrating to Jersey 3, javax libaries are still requested

824 Views Asked by At

I am trying to migrate an old server to Jersey 3.0.8.

Among other issues, I found this one when accessing the landing page of the server:

Type Exception Report

Message Error allocating a servlet instance

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

jakarta.servlet.ServletException: Error allocating a servlet instance
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)
Root Cause

A MultiException has 2 exceptions.  They are:
1. java.lang.IllegalStateException: Could not find an active context for jakarta.inject.Singleton
2. java.lang.IllegalStateException: While attempting to create a service for SystemDescriptor(
    implementation=org.glassfish.jersey.moxy.json.internal.ConfigurableMoxyJsonProvider
    contracts={jakarta.ws.rs.ext.MessageBodyWriter,jakarta.ws.rs.ext.MessageBodyReader}
    scope=jakarta.inject.Singleton
    qualifiers={org.glassfish.jersey.internal.inject.Custom}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=7000
    loader=null
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=154
    locatorId=0
    identityHashCode=115592056
    reified=true) in scope jakarta.inject.Singleton an error occured while locating the context

    org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2096)
    org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
    org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:67)
    org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.lambda$getAllServiceHolders$0(AbstractHk2InjectionManager.java:136)
    java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1242)
    java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getAllServiceHolders(AbstractHk2InjectionManager.java:140)
    org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getAllServiceHolders(ImmediateHk2InjectionManager.java:30)
    org.glassfish.jersey.internal.inject.Providers.getServiceHolders(Providers.java:307)
    org.glassfish.jersey.internal.inject.Providers.getCustomProviders(Providers.java:151)
    org.glassfish.jersey.message.internal.MessageBodyFactory.initialize(MessageBodyFactory.java:219)
    org.glassfish.jersey.message.internal.MessageBodyFactory$MessageBodyWorkersConfigurator.postInit(MessageBodyFactory.java:114)
    org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$2(ApplicationHandler.java:353)
    java.base/java.util.Arrays$ArrayList.forEach(Arrays.java:4204)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:353)
    org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:296)
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:339)
    jakarta.servlet.GenericServlet.init(GenericServlet.java:178)
    jakarta.servlet.http.HttpServlet.init(HttpServlet.java:107)
    org.apache.catalina.startup.Tomcat$ExistingStandardWrapper.loadServlet(Tomcat.java:1219)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)
Root Cause

java.lang.IllegalStateException: Could not find an active context for jakarta.inject.Singleton
    org.jvnet.hk2.internal.ServiceLocatorImpl._resolveContext(ServiceLocatorImpl.java:2212)
    org.jvnet.hk2.internal.ServiceLocatorImpl.access$000(ServiceLocatorImpl.java:106)
    org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:166)
    org.jvnet.hk2.internal.ServiceLocatorImpl$3.compute(ServiceLocatorImpl.java:162)
    org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:74)
    java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:131)
    org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:176)
    org.jvnet.hk2.internal.ServiceLocatorImpl.resolveContext(ServiceLocatorImpl.java:2220)
    org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2080)
    org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:93)
    org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:67)
    org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.lambda$getAllServiceHolders$0(AbstractHk2InjectionManager.java:136)
    java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    java.base/java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1242)
    java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.getAllServiceHolders(AbstractHk2InjectionManager.java:140)
    org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.getAllServiceHolders(ImmediateHk2InjectionManager.java:30)
    org.glassfish.jersey.internal.inject.Providers.getServiceHolders(Providers.java:307)
    org.glassfish.jersey.internal.inject.Providers.getCustomProviders(Providers.java:151)
    org.glassfish.jersey.message.internal.MessageBodyFactory.initialize(MessageBodyFactory.java:219)
    org.glassfish.jersey.message.internal.MessageBodyFactory$MessageBodyWorkersConfigurator.postInit(MessageBodyFactory.java:114)
    org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$2(ApplicationHandler.java:353)
    java.base/java.util.Arrays$ArrayList.forEach(Arrays.java:4204)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:353)
    org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:296)
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:339)
    jakarta.servlet.GenericServlet.init(GenericServlet.java:178)
    jakarta.servlet.http.HttpServlet.init(HttpServlet.java:107)
    org.apache.catalina.startup.Tomcat$ExistingStandardWrapper.loadServlet(Tomcat.java:1219)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)

While trying to solve it, I found that Jersey 3 uses the jakarta namespace to replace the javax one, so I replaced implementation("javax.servlet:javax.servlet-api:4.0.1") with implementation("jakarta.servlet:jakarta.servlet-api:6.0.0"). I also went trough the code and replaced all the imports of dependencies with the javax namespace to ones with jakarta. The only classes that I couldn't migrate were the ones accessing javax.imageio, as there seems to be no jakarta equivalent for them.

But then, when I try to run the server and access an endpoint, I get this error:

Type Exception Report

Message Error allocating a servlet instance

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

jakarta.servlet.ServletException: Error allocating a servlet instance
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)
Root Cause

java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    org.glassfish.jersey.server.spring.SpringComponentProvider.initialize(SpringComponentProvider.java:69)
    org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$null$0(ComponentProviderConfigurator.java:55)
    java.base/java.util.stream.ReferencePipeline$15$1.accept(ReferencePipeline.java:540)
    java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
    java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$init$1(ComponentProviderConfigurator.java:56)
    org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:317)
    org.glassfish.jersey.server.ResourceModelConfigurator.bindProvidersAndResources(ResourceModelConfigurator.java:111)
    org.glassfish.jersey.server.ResourceModelConfigurator.init(ResourceModelConfigurator.java:63)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:346)
    org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:296)
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:339)
    jakarta.servlet.GenericServlet.init(GenericServlet.java:178)
    jakarta.servlet.http.HttpServlet.init(HttpServlet.java:107)
    org.apache.catalina.startup.Tomcat$ExistingStandardWrapper.loadServlet(Tomcat.java:1219)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)
Root Cause

java.lang.ClassNotFoundException: javax.servlet.ServletContext
    java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    org.glassfish.jersey.server.spring.SpringComponentProvider.initialize(SpringComponentProvider.java:69)
    org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$null$0(ComponentProviderConfigurator.java:55)
    java.base/java.util.stream.ReferencePipeline$15$1.accept(ReferencePipeline.java:540)
    java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
    java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
    java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    org.glassfish.jersey.server.ComponentProviderConfigurator.lambda$init$1(ComponentProviderConfigurator.java:56)
    org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:317)
    org.glassfish.jersey.server.ResourceModelConfigurator.bindProvidersAndResources(ResourceModelConfigurator.java:111)
    org.glassfish.jersey.server.ResourceModelConfigurator.init(ResourceModelConfigurator.java:63)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:346)
    org.glassfish.jersey.server.ApplicationHandler.lambda$initialize$1(ApplicationHandler.java:297)
    org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    org.glassfish.jersey.internal.Errors.processWithException(Errors.java:232)
    org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:296)
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:339)
    jakarta.servlet.GenericServlet.init(GenericServlet.java:178)
    jakarta.servlet.http.HttpServlet.init(HttpServlet.java:107)
    org.apache.catalina.startup.Tomcat$ExistingStandardWrapper.loadServlet(Tomcat.java:1219)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.base/java.lang.Thread.run(Thread.java:833)

The error is clearly about javax.servlet.ServletContext not being found.

When I add the javax.servlet import alongside the jakarta.servlet one, the original issue comes back.

Do you know of a way around this problem? Is it necessarily around the build configuration or could it be coming from a different place?

For context, I am trying to run this project using Tomcat Embedded and I am using Gradle for building it.

Any insights would be greatly appreciated.

1

There are 1 best solutions below

0
On

After digging, I found that I had a couple of nested dependency related to javax:

  • javax.annotation-api:1.2
  • javax.ws.rs-api:2.0.1

Intellij screenshot

They were both related to cxf-rt-rs-security-cors:3.1.2.

After I upgraded it to 3.5.4 the problem went away.