我正在尝试使用 Jersey JAX-RS 实现一个 Restful 网络服务。 我嵌入了一个 Jetty 网络服务器并想在其上注册所有 Controller 。
我基于这个例子: https://nikgrozev.com/2014/10/16/rest-with-embedded-jetty-and-jersey-in-a-single-jar-step-by-step/
其中 EntryPoint 是 Controller :
@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();
}
}
}
如何注册多个 Controller ?
如果我添加其他 Controller 类作为参数,我不知道我必须为每个 Controller 类指定什么键名,因为只有“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
它在扫描中找到的类。
关于java - Jersey JAX-RS 在嵌入式 Jetty 上注册更多 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52551546/