我有一个我想要公开的资源,它有一个带有注入参数的构造函数。但是我没有使用任何注入框架,我已经嵌入了Jetty。
现在Jetty用这个扫描资源:
ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server");
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class);
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan");
servletContextHandler.addServlet(jerseyServletHolder, "/*");
但它阻止我在构造函数中注入任何东西,所以我必须使用默认的构造函数。
我想指定我自己的实例传递给我的资源构造函数。有没有办法手动实例化资源并将其添加到servlet容器?
是否可以做这样的事情:
MyRestResource resource = new MyRestResource(param1, param2);
servletContextHandler.addServlet(resource);
或类似的东西?
答案 0 :(得分:8)
您可以通过向自定义的ResourceConfig注册(Jersey)ServletContainer来将依赖项注入Jersey资源。请查看下面的代码,作为创建TimeResource类的示例,其中时钟通过构造函数注入其中。
public void start() {
server = new Server(6666);
ServletContextHandler handler = new ServletContextHandler();
handler.setContextPath("");
// adds Jersey Servlet with a customized ResourceConfig
handler.addServlet(new ServletHolder(new ServletContainer(resourceConfig())), "/*");
server.setHandler(handler);
try {
server.start();
} catch (Exception e) {
throw new RuntimeException("Could not start the server", e);
}
}
private ResourceConfig resourceConfig() {
// manually injecting dependencies (clock) to Jersey resource classes
return new ResourceConfig().register(new TimeResource(clock));
}
源代码的完整示例位于:
答案 1 :(得分:3)
如果MyRestResource
是Servlet
,那么您可以使用existing servlet holder constructor。
ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server");
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class);
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan");
servletContextHandler.addServlet(jerseyServletHolder, "/*");
MyRestResource resource = new MyRestResource(param1, param2);
// wrap resource in a ServletHolder
ServletHolder resourceHolder = new ServletHolder(resource);
// assign resource to a Servlet pathSpec
servletContextHandler.addServlet(resourceHolder, "/rest");
如果您有servlet,并希望在启动时访问某些设置,请使用ContextHandler.setAttribute(String, Object)和ServletContext.getAttribute(String)技术。
在您的服务器启动中
ServletContextHandler servletContextHandler = new ServletContextHandler(server, "/server");
ServletHolder jerseyServletHolder = new ServletHolder(ServletContainer.class);
jerseyServletHolder.setInitParameter("com.sun.jersey.config.property.packages", "my.package.to.scan");
servletContextHandler.addServlet(jerseyServletHolder, "/*");
MyRestResource resource = new MyRestResource(param1, param2);
// Set resource as a context attribute
servletContextHandler.setAttribute("rest-1", resource);
然后稍后从servlet api
访问ServletContext ctx = servletRequest.getServletContext();
MyRestResource resource = (MyRestResource) ctx.getAttribute("rest-1");