嵌入式Jetty上的Jersey与hk2定位器没有加载ResourceConfig

时间:2018-02-04 04:43:46

标签: jersey jetty embedded-jetty hk2

我使用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类。

如果我添加:

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

然后ResourceConfig会加载。

为什么MyResoureConfig根据@ApplicationPath注释被选中?

1 个答案:

答案 0 :(得分:3)

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

首先将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)的关键一个