2

I am having troubles trying to hook up jersey3 with jetty11 embedded server. My code is

        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

        servletContextHandler.setContextPath("/");
        
        ResourceConfig resourceCfg = new ResourceConfig();
        resourceCfg.packages(TestResource.class.getPackage().getName());      
        
        ServletContainer servletContainer = new ServletContainer(resourceCfg);
        
        ServletHolder servletHolder = new ServletHolder(servletContainer);
        servletContextHandler.addServlet(servletHolder, "/api/*");
        
        this.setHandler(servletContextHandler);

This code exactly throws an error

Exception in thread "main" jakarta.servlet.ServletException: org.glassfish.jersey.servlet.ServletContainer-22356acd==org.glassfish.jersey.servlet.ServletContainer@d1f8ecbc{jsp=null,order=-1,inst=true,async=true,src=EMBEDDED:null,STARTED}
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:651)
    at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:415)
    at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$2(ServletHandler.java:690)
    at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
    at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735)
    at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:714)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:392)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:896)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:306)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:171)
    at org.eclipse.jetty.server.Server.start(Server.java:469)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:89)
    at org.eclipse.jetty.server.Server.doStart(Server.java:414)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:93)
    at org.projectsanatan.restsanatan.RestSanatan.start(RestSanatan.java:27)
    at org.projectsanatan.restsanatan.Main.main(Main.java:21)
Caused by: java.lang.IllegalStateException: InjectionManagerFactory not found.
    at org.glassfish.jersey.internal.inject.Injections.lambda$lookupInjectionManagerFactory$0(Injections.java:74)
    at java.base/java.util.Optional.orElseThrow(Optional.java:403)
    at org.glassfish.jersey.internal.inject.Injections.lookupInjectionManagerFactory(Injections.java:74)
    at org.glassfish.jersey.internal.inject.Injections.createInjectionManager(Injections.java:69)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:261)
    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:339)
    at jakarta.servlet.GenericServlet.init(GenericServlet.java:178)
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:633)
    ... 21 more

However, adding this.setHandler(new HandlerList()), doesn't cause that error. I think this is because .setHandler method overwrites the other handlers. I still do not know what could be the reason that causes the error. Help would be appreciated!

1 Answers1

1

You don't have all of the dependencies you need to run Jersey 3.

You seem to be missing the org.glassfish.jersey.internal.inject.InjectionManagerFactory class.

Found in the following maven coordinates...

https://search.maven.org/search?q=fc:org.glassfish.jersey.internal.inject.InjectionManagerFactory

See past answers for help identifying which artifact fits your needs...

BTW, you can get the Servlet to init on startup, so you don't need to send a request to trigger this setup issue.

ServletHolder servletHolder = new ServletHolder(servletContainer);
servletHolder.setInitOrder(1); // <-- this line
servletContextHandler.addServlet(servletHolder, "/api/*");
Joakim Erdfelt
  • 46,896
  • 7
  • 86
  • 136