Search code examples
jerseyjettyembedded-jettyhk2

Jersey on embedded Jetty with hk2 locator not loading ResourceConfig


I am using Jetty as an embedded server for Jersey.

ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class);
jerseyServletHolder.setInitOrder(1);
jerseyServletHolder.setInitParameter(
    org.glassfish.jersey.server.ServerProperties.PROVIDER_PACKAGES,
    "com.my.package");
webAppContext.addServlet(jerseyServletHolder, "/rest/*");

I have a ResourceConfig implementation:

@ApplicationPath("/rest")
public class MyResourceConfig extends ResourceConfig {


    static{
        System.out.println("ResourceConfig loaded");
        // this never gets calls
    }


    @Inject
    public MyResourceConfig(ServiceLocator serviceLocator, Properties serverProps) {
        packages("com.my.package");
    }
}

The problem is that when I launch, the MyResourceConfig class is never loaded.

If I add:

jerseyServletHolder.setInitParameter(
    ServletProperties.JAXRS_APPLICATION_CLASS,
    MyResourceConfig.class.getName());

then the ResourceConfig does get loaded.

Why isn't MyResoureConfig getting picked up based on the @ApplicationPath annotation?


Solution

  • You just need annotation / bytecode scanning enabled.

    Start by putting jetty-annotations-<version>.jar (and transitive dependencies) into your project.

    Then, in your code, after you create your org.eclipse.jetty.server.Server object, do this.

    Server server = new Server(8080);
    
    // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
    Configuration.ClassList classlist = Configuration.ClassList
            .setServerDefault(server);
    classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
            "org.eclipse.jetty.plus.webapp.EnvConfiguration",
            "org.eclipse.jetty.plus.webapp.PlusConfiguration");
    // Enable annotation/bytecode scanning and ServletContainerInitializer usages
    classlist.addBefore(
            "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
            "org.eclipse.jetty.annotations.AnnotationConfiguration");
    
    WebAppContext webAppContext = createWebAppContext();
    // ....
    server.start();
    

    That will enable the configurations needed to perform bytecode scanning and annotation scanning, along with enabling the ability to load any javax.servlet.ServletContainerInitializer found within your webapp, including the critical one from Jersey (org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer)