Java 如何从Jersey资源访问非单例对象?

Java 如何从Jersey资源访问非单例对象?,java,jersey,Java,Jersey,在我们公司,我们在Windows中大量使用小型Java应用程序作为服务。为了能够从这些应用程序获取状态报告,我们使用Jersey输出一些JSON数据 为了获得所需的应用程序数据,我们目前将应用程序设置为单例。从Jersey中的资源处理程序中,我们可以通过对象的静态getInstance方法访问该对象 现在,我们正在升级整个应用程序环境,并对我们的应用程序进行了一些更改。其中一个变化是应用程序不再是单例的。有没有其他方法可以访问应用程序对象,而不需要它是单例对象,也不需要处理程序是内部类 以下是代

在我们公司,我们在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配置,我描述了如何为我的服务器进行配置