0

我继承了一个小 Web 应用程序,其中包含类似于以下内容的根资源:

import javax.ws.rs.Path;

@Path("somepath")
public class ResourceClass
{
   DataSource source = new SpecificDataSource();
   @GET
   public String getInfo() {
      return source.queryThatReturnsNumber().toString();
   }
}

并且有几个不同的类与此类似。有没有一种方法可以将源成员变量设置为 SpecificDataSource 以外的值?我对此相当陌生,但在传统的 POJO 中,我将有一个构造函数,它接受一个实现 DataSource 接口的类并将源设置为该对象。对于泽西岛,我不相信我可以直接控制这些对象的构造。

简单来说,有没有办法为 Jersey Root Resource 类提供初始化机制?

4

2 回答 2

0

由于您使用的是数据源,因此我建议为您的资源配置 jndi。根据您的服务器环境,将有不同的方式来配置您的 jndi 资源。这是让您的单例资源由应用程序服务器配置和/或池化的好方法。

DataSource ds = (DataSource) new InitialContext().lookup("jdbc/specificResource");
con = ds.getConnection();

如果您使用的是支持 ejb 的应用程序服务器(GlassFish、Tomee、Jboss),您也可以使用本机 di 支持。

@Resource(name="specificResource")
DataSource ds;

这是一个很好的网络教程。 http://penguindreams.org/blog/running-beans-that-use-application-server-datasources-locally/

作为更复杂依赖项的简单替代方案。我会推荐 jersey-guice 依赖注入。我用过很多次,很容易配置和使用。

于 2014-01-02T16:54:52.803 回答
0

你可能已经想通了;但是您可以通过使用 Jersey 过滤器来实现它。我已经修改了你的代码来实现它。这适用于 Jersey 1.8;对于更高版本,语法/名称可能会有所不同。

@Path("somepath")
public class ResourceClass implements ContainerRequestFilter
{
    private static DataSource source = new SpecificDataSource();
    @GET
    public String getInfo() {
        return source.queryThatReturnsNumber().toString();
    }

    @Override
    public ContainerRequest filter(ContainerRequest requestContext) {
        // initialize DataSource source
        return requestContext;
    }
}
于 2016-11-05T06:45:08.520 回答