嵌入式码头上的球衣,hk2定位器未加载资源配置



我正在使用Jetty作为泽西岛的嵌入式服务器。

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/*");

我有一个资源配置实现:

@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 类永远不会加载。

如果我添加:

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

然后资源配置确实被加载了。

为什么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();

这将启用执行字节码扫描和注释扫描所需的配置,同时能够加载在Web应用程序中找到的任何javax.servlet.ServletContainerInitializer,包括来自泽西岛(org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer(的关键