我正在使用Jetty 9.0.6将Jersey网页应用程序从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;
}
}
答案 0 :(得分:0)
乌利,
您引用的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)
欢呼声 扬