Kevin Day
Kevin Day

Reputation: 16383

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?

Upvotes: 1

Views: 706

Answers (1)

Joakim Erdfelt
Joakim Erdfelt

Reputation: 49515

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)

Upvotes: 3

Related Questions