泽西 jdbc @resource 不工作

Jersey jdbc @resource not working

我正在尝试在我现有的 tomcat 7.0.57 上安装一个简单的基于 Jersey 的 jaxrs 侦听器 运行。 Tomcat 在其 context.xml 中有一个 jdbc 数据源的全局配置,我想使用它。

我的问题是我无法通过@Resource 注释获取要解析的资源。

这里是一个简单的测试例子

@Path("/")
public class TestJersey {
    @Resource(name = "jdbc/default")
    private DataSource dsA;

    @Resource(name = "java:comp/env/jdbc/default")
    private DataSource dsB;

    @Resource(lookup = "java:comp/env/jdbc/default")
    private DataSource dsC;

    @Resource(mappedName="jdbc/default")
    private DataSource dsD;

    @GET
    @Produces("text/plain")
    public String test() throws NamingException {
        StringBuffer ret = new StringBuffer();
        ret.append("A: " + dsA + "\n");
        ret.append("B: " + dsB + "\n");
        ret.append("C: " + dsC + "\n");
        ret.append("D: " + dsD + "\n");        
        DataSource ds1 = 
              (DataSource) InitialContext.doLookup("java:comp/env/jdbc/default");
        ret.append("1: " + ds1 + "\n");
        return ret.toString();
    }
}

本次测试应用returns以下

A: null
B: null
C: null
D: null
1: org.apache.tomcat.jdbc.pool.DataSource@1518c95{ConnectionPool[d.....

所以 jdbc 连接已配置,并且可以通过显式 doLookup 进行访问,那么为什么我不能使用 @Resource 注释使其工作?

我的应用程序 web.xml 包含

<servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.test</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

我花了一些时间寻找我做错了什么,但我找不到。我读过建议添加类似以下 web.xml 片段的帖子,但它们没有帮助

  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/default</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

为了完整起见,我的 Maven 依赖项只是球衣:

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.19</version>
</dependency>

看起来 peeskillet 需要某种程度的 CDI 是正确的。

我将解释我必须添加的内容,因为它有点偏离我找到的许多说明。

首先,您需要一个 CDI 管理器,weld 就是其中之一,因此我们需要在我们的 pom 中为此添加一个依赖项

<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet</artifactId>
    <version>2.2.15.Final</version>
</dependency>

它还需要一个日志记录依赖项,以避免警告或获取任何日志记录,所以这样的事情将使日志正常java util logging

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.12</version>
</dependency>

仅此还不够,因为运动衫显然 uses hk, not cdi 所以您需要一个适配器。

<dependency>
    <groupId>org.glassfish.jersey.containers.glassfish</groupId>
    <artifactId>jersey-gf-cdi</artifactId>
    <version>2.6</version>
</dependency>

然后那个适配器似乎有一个 broken dependency 所以我们需要再添加一个以避免每个请求有两页堆栈跟踪。

<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>

所以现在您已经准备好所有代码,您需要做最后一件事才能让它真正起作用。

您需要一个空 WEB-INF/beans.xml。我不太明白为什么。

一些网站还声明您需要一个 META-INF/context.xml 条目,但我没有发现我需要那个,也许它是为了注入自定义 类?

希望这对其他人有帮助