我继承了一个包含类似于:
的根资源的小型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类提供初始化机制?
答案 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;
}
}