带有 hk2 定位器的嵌入式 Jetty 上的 Jersey 未加载 ResourceConfig

Jersey on embedded Jetty with hk2 locator not loading ResourceConfig

我正在使用 Jetty 作为 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/*");

我有一个 ResourceConfig 实现:

@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");
    }
}

问题是当我启动时,MyResourceConfig class 从未加载。

如果我添加:

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

然后会加载 ResourceConfig。

为什么 MyResoureConfig 没有根据 @ApplicationPath 注释获取?

您只需要启用注释/字节码扫描。

首先将 jetty-annotations-<version>.jar(和传递依赖项)放入您的项目中。

然后,在您的代码中,在创建 org.eclipse.jetty.server.Server 对象后,执行此操作。

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();

这将启用执行字节码扫描和注释扫描所需的配置,同时启用加载在您的 webapp 中找到的任何 javax.servlet.ServletContainerInitializer 的能力,包括来自 Jersey 的关键 (org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer)