Java 如何从Jersey资源访问非单例对象?
在我们公司,我们在Windows中大量使用小型Java应用程序作为服务。为了能够从这些应用程序获取状态报告,我们使用Jersey输出一些JSON数据 为了获得所需的应用程序数据,我们目前将应用程序设置为单例。从Jersey中的资源处理程序中,我们可以通过对象的静态getInstance方法访问该对象 现在,我们正在升级整个应用程序环境,并对我们的应用程序进行了一些更改。其中一个变化是应用程序不再是单例的。有没有其他方法可以访问应用程序对象,而不需要它是单例对象,也不需要处理程序是内部类 以下是代码的简化版本:Java 如何从Jersey资源访问非单例对象?,java,jersey,Java,Jersey,在我们公司,我们在Windows中大量使用小型Java应用程序作为服务。为了能够从这些应用程序获取状态报告,我们使用Jersey输出一些JSON数据 为了获得所需的应用程序数据,我们目前将应用程序设置为单例。从Jersey中的资源处理程序中,我们可以通过对象的静态getInstance方法访问该对象 现在,我们正在升级整个应用程序环境,并对我们的应用程序进行了一些更改。其中一个变化是应用程序不再是单例的。有没有其他方法可以访问应用程序对象,而不需要它是单例对象,也不需要处理程序是内部类 以下是代
public class Main {
protected int data; // a property which has to be accessible by
// the jersey handler
protected Closeable server;
protected ResourceConfig resourceConfig;
public Main() {
// set the jersey handle
resourceConfig = new DefaultResourceConfig(JerseyHandler.class);
// start the jersey server
server = SimpleServerFactory.create("http://0.0.0.0:" + port, resourceConfig);
}
public int getData() {
return data;
}
}
@Path("/")
public class JerseyHandler {
@Path("status")
@GET
public Response status() {
// how to access Main's getData() method from here without
// anything being a singleton or an inner class???
int data = ????;
Response.ok().entity(data).build();
}
}
您应该使用Jersey支持的依赖项注入机制将Main作为依赖项注入。我使用Jersey 2.12和Google Guice 3.0实现同样的目的 例如:
@Singleton
@Path("language")
@Produces(MediaType.APPLICATION_JSON)
public class LanguageResource {
private final LanguageService langService;
@Inject
public LanguageResource(LanguageService dateService) {
langService = dateService;
}
}
要使用自定义GUI模块配置侦听器,请执行以下操作:
ServletContextHandler handler = new ServletContextHandler();
handler.setServer(server);
handler.addEventListener(new ServletGuiceConfig());
您的GUI配置可能如下所示:
public class ServletGuiceConfig extends GuiceServletContextListener {
protected static Injector injector;
@Override
protected Injector getInjector() {
injector = Guice.createInjector(new ServiceConfig(), new ServletModule() {
@Override
protected void configureServlets() {
bind(LanguageService.class).to(LanguageServiceImpl.class);
}
});
return injector;
}
}
这看起来确实像我需要的。谢谢!最后一个问题:你不需要声明应该注入哪个LanguageService实例吗?@RickBrunken:我被打断了。我更新了我的答案。当然,应该提供您的Guice配置,我描述了如何为我的服务器进行配置