Search code examples
javatomcatjerseyjax-rsjakarta-migration

java.lang.IllegalArgumentException: The implementation class org.glassfish.jersey.inject.hk2.RequestContext must be in the Singleton scope


I am upgrading a Tomcat web applications from Tomcat 9.0.78 to 10.0.14 and moved all my imports from the javax.servelet name space to jakarta.servelt name space and have also upgraded hibernate.

While I have been able to resolve most of the issues I am stuck with the following error I see in /tomcat/logs/localhost.2023-09-12.log

I have tried removing jars from tomcat/lib such as jakarta.inject-2.6.1.jar and jakarta.inject-api-2.0.0.jar but these cause class not found exceptions.

I assumed the error means that two separate places are trying to instantiate org.glassfish.jersey.inject.hk2.RequestContext but I cannot figure out where.

EDIT:

Having looked at the source code, it is not an issue that org.glassfish.jersey.inject.hk2.RequestContext is being created twice but that it does not implement jakarta.singleton space.

as per jan.supol's comment all jersey jars are on version 3.0.2, one of which contains the offending class.

jersey-hk2-3.0.2.jar:
      877  01-01-1980 00:00   org/glassfish/jersey/inject/hk2/RequestContext$Binder$1.class
     1170  01-01-1980 00:00   org/glassfish/jersey/inject/hk2/RequestContext$Binder.class
     4459  01-01-1980 00:00   org/glassfish/jersey/inject/hk2/RequestContext.class


-rwxrwxr-x 1 root tomcat   31856 Sep  6 11:11 jersey-container-servlet-3.0.2.jar
-rwxrwxr-x 1 root tomcat 1170111 Sep  6 11:11 jersey-common-3.0.2.jar
-rwxrwxr-x 1 root tomcat   75633 Sep  6 11:11 jersey-hk2-3.0.2.jar
-rwxrwxr-x 1 root tomcat   72355 Sep  6 11:11 jersey-container-servlet-core-3.0.2.jar
-rwxrwxr-x 1 root tomcat  934996 Sep  6 11:11 jersey-server-3.0.2.jar
-rw-rw-r-- 1 vcr  vcr      94880 Sep 14 12:17 jersey-media-jaxb-3.0.2.jar
-rw-rw-r-- 1 vcr  vcr      79408 Sep 14 12:17 jersey-media-sse-3.0.2.jar
-rw-rw-r-- 1 vcr  vcr      26118 Sep 14 12:17 jersey-media-json-binding-3.0.2.jar
023 12:14:49.238 SEVERE [main] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [jersey-serlvet] in web application [/ngen] threw load() exception
        java.lang.IllegalArgumentException: The implementation class org.glassfish.jersey.inject.hk2.RequestContext must be in the Singleton scope
                at org.jvnet.hk2.internal.ServiceLocatorImpl.checkConfiguration(ServiceLocatorImpl.java:1700)
                at org.jvnet.hk2.internal.ServiceLocatorImpl.addConfiguration(ServiceLocatorImpl.java:2095)
                at org.jvnet.hk2.internal.DynamicConfigurationImpl.commit(DynamicConfigurationImpl.java:262)
                at org.glassfish.hk2.utilities.ServiceLocatorUtilities.bind(ServiceLocatorUtilities.java:166)
                at org.glassfish.jersey.inject.hk2.AbstractHk2InjectionManager.<init>(AbstractHk2InjectionManager.java:65)
                at org.glassfish.jersey.inject.hk2.ImmediateHk2InjectionManager.<init>(ImmediateHk2InjectionManager.java:38)
                at org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory$Hk2InjectionManagerStrategy$1.createInjectionManager(Hk2InjectionManagerFactory.java:55)
                at org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory.create(Hk2InjectionManagerFactory.java:73)
                at org.glassfish.jersey.internal.inject.Injections.createInjectionManager(Injections.java:69)
                at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:259)
                at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
                at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:154)
                at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:347)
                at jakarta.servlet.GenericServlet.init(GenericServlet.java:158)
                at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1165)
                at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1118)
                at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1011)
                at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4906)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5213)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:698)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:747)
                at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1188)
                at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2023)
                at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
                at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1098)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:480)
                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1708)
                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:320)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:946)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:886)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:795)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:568)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)

The following are my dependencies for glass fish:


        <h2k.version>3.0.2</h2k.version> 
        <h2k.locator.version>3.0.1</h2k.locator.version>
        <jakarta.inject.version>2.6.1</jakarta.inject.version>
        
        <dependency>
            <groupId>org.glassfish.hk2</groupId>
            <artifactId>hk2-api</artifactId>
            <version>${h2k.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.hk2</groupId>
            <artifactId>hk2-locator</artifactId>
            <version>${h2k.locator.version}</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.hk2</groupId>
            <artifactId>hk2-utils</artifactId>
            <version>${h2k.version}</version>
        </dependency>


Solution

  • I fixed this by targeting all my jars based on my Tomcat version. I found that my tomcat version used Jakarta ee 9, and I target all my third party jars around that.

    Specifically in my case it was the version of the hk2 jars that were the culprit.