我正在使用 Jetty 9.0.6 将我的 Jersey Web 应用程序从 Jersey 1.17.1 迁移到 2.3.1。使用 Jersey 1.17.1,资源将在启动期间加载。但是,几乎相同的代码(如下)仅在收到请求时启动。但我想确保它在启动期间加载(即调用带注释的资源类的构造函数)。知道出了什么问题吗?
public static void startServer(){
org.eclipse.jetty.server.Server server = new Server();
org.eclipse.jetty.servlet.ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
org.glassfish.jersey.servlet.ServletContainer servletContainer = new ServletContainer();
org.eclipse.jetty.servlet.ServletHolder servletHolder = new ServletHolder(servletContainer);
servletHolder.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "mypackage");
servletHolder.setInitOrder(0); // this does not seem to work
context.addServlet(servletHolder, "/*");
server.start();
}
粗略地说:
package mypackage;
@Singleton
@Path("/foo")
public class MyResource {
public MyResource(){
// I want this to be called when I start the server
}
@Path("bar")
public Response receivePayload(@Context HttpServletRequest request, String payloadString){
// do some stuff
return response;
}
}
最佳答案
乌力,
您所指的 servletHolder.setInitOrder(0) 与 org.glassfish.jersey.servlet.ServletContainer 类相关。 jetty-9.0.6 中 servlet init 排序的单元测试正在通过,因此我假设 jersey ServletContainer 类实际上正在按预期在启动时加载。
也许 jersey 在 1.17 和 2.3 版本之间改变了行为,并且只延迟初始化使用 @Path 注释映射的资源?
或者也许 jersey 已更改为使用某些 servlet 3.0 功能进行初始化,例如 ServletContainerInitializers?如果是这种情况,那么您需要从 ServletContextHandler 升级到 WebAppContext,并确保启用对这些 servlet 3.0 功能的支持(请参阅此处有关使用嵌入式 jetty 注释的 jetty 文档:http://www.eclipse.org/jetty/documentation/current/using-annotations-embedded.html)
干杯 简
关于java - 如何使用带有嵌入式 Jetty 的 Jersey 2.3 在启动时加载 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19552111/