【问题标题】:Jersey Root Resource member variable initializationJersey Root 资源成员变量初始化
【发布时间】:2014-01-02 15:58:38
【问题描述】:

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

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 类提供初始化机制?

【问题讨论】:

  • 查看 jersey-spring 集成并使用依赖注入。
  • 您确定在创建 ResoureClass 对象期间从未调用构造函数吗?我几乎可以肯定,无论您拥有什么样的资源,在较低级别,JVM 中的对象创建都不会改变(假设您使用的是默认构造函数而不是某些特殊构造函数)。最简单的测试方法是创建一个默认构造函数 public ResourceClass() {System.out.println("HI FROM CONSTRUCTOR");},使用其他客户端(或浏览器)调用 /somepath 并在日志中查看是否看到此日志陈述。我假设它会在每次通话时记录 SOP。
  • 这应该可以告诉你构造函数是否被调用。如果不是(我将不得不尝试),那么您将不得不以其他方式注入对象,但根据我的猜测,我确信它应该在对象创建时调用默认构造函数。这样,您可以在默认构造函数中实例化您想要的任何实例字段。
  • 哦,它们的构造函数正在被调用,但我无法控制它是如何被调用的(我可能在这里错了。)就像我想传递构造函数参数一样:ResourceClass(new BlueDataSource()) vs ResourceClass(new RedDataSource())

标签: java rest jersey jersey-1.0


【解决方案1】:

由于您使用的是数据源,我建议为您的资源配置 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 依赖注入。我用过很多次,很容易配置和使用。

【讨论】:

    【解决方案2】:

    你可能已经明白了;但是您可以通过使用 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 2014-09-08
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      相关资源
      最近更新 更多