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

时间:2014-09-04 07:27:03

标签: 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();
    }
}

1 个答案:

答案 0 :(得分:-1)

您应该使用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;
    }
}

使用自定义Guice模块配置侦听器:

        ServletContextHandler handler = new ServletContextHandler();
        handler.setServer(server);
        handler.addEventListener(new ServletGuiceConfig());

您的Guice配置可能如下所示:

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;
    }
}