Jersey JAX-RS 在嵌入式 Jetty 上注册更多控制器

Jersey JAX-RS register more controllers on embedded Jetty

我正在尝试使用 Jersey JAX-RS 实现 restful Web 服务。 我嵌入了一个 Jetty 网络服务器并想在其上注册所有控制器。

我基于这个例子: https://nikgrozev.com/2014/10/16/rest-with-embedded-jetty-and-jersey-in-a-single-jar-step-by-step/

其中 EntryPoint 是控制器:

@Path("/entry-point")
public class EntryPoint {

  @GET
  @Path("test")
  @Produces(MediaType.TEXT_PLAIN)
  public String test() {
    return "Test";
  }
}

这是使用密钥名称“jersey.config.server.provider.classnames”注册的,如下所示:

public class App {

  public static void main(String[] args) throws Exception {
    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.setContextPath("/");

    Server jettyServer = new Server(8080);
    jettyServer.setHandler(context);

    ServletHolder jerseyServlet = context.addServlet(
         org.glassfish.jersey.servlet.ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);

    // Tells the Jersey Servlet which REST service/class to load.

    jerseyServlet.setInitParameter(
       "jersey.config.server.provider.classnames",
       EntryPoint.class.getCanonicalName());

    try {
        jettyServer.start();
        jettyServer.join();
    } finally {
        jettyServer.destroy();
    }
  }
}

如何注册多个控制器?

如果我添加其他控制器 类 作为参数,我不知道必须为每个控制器指定什么键名,因为只有“jersey.config.server.provider.classnames “似乎工作并且工作一次。 谢谢

因为属性只能使用一次,所以需要使用逗号分隔的列表作为值classOne, classTwo, classThree.

另一种选择是使用 属性 jersey.config.server.provider.packages 并只给它一个包来递归扫描

jerseyServlet.setInitParam(ServerProperties.PROVIDER_PACKAGES, "my.package.to.scan");

有关您可以设置的更多属性,请参阅 ServerProperties。这里PROVIDER_PACAKGES是一个常量,它的字符串值为jersey.config.server.provider.packages。与 classnames 属性 相同,有一个常量 PROVIDER_CLASSNAMES.

通过声明要扫描的包,Jersey 将递归地(默认情况下)扫描该包并注册所有 @Path@Provider 注释 [=30] =] 它在扫描中找到。