Jersey Root Resource成员变量初始化

时间:2014-01-02 15:58:38

标签: java rest jersey jersey-1.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接口的类并将source设置为该对象。对于泽西岛,我不相信我可以直接控制这些物体的构造。

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

2 个答案:

答案 0 :(得分:0)

由于您使用的是数据源,我建议您为资源配置jndi。根据您的服务器环境,将有不同的方法来配置您的jndi资源。这是应用程序服务器配置和汇集Singleton资源的好方法。

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依赖注射。我已经使用过很多次了,它很容易配置和使用。

答案 1 :(得分:0)

你可能已经想到了这一点;但是你可以使用泽西过滤器来实现它。我修改了你的代码来实现它。这适用于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;
    }
}