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] =] 它在扫描中找到。
我正在尝试使用 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] =] 它在扫描中找到。