Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey jdbc@resource不工作_Java_Tomcat_Jdbc_Tomcat7_Jersey 2.0 - Fatal编程技术网

Java Jersey jdbc@resource不工作

Java Jersey jdbc@resource不工作,java,tomcat,jdbc,tomcat7,jersey-2.0,Java,Tomcat,Jdbc,Tomcat7,Jersey 2.0,我试图在现有的Tomcat7.0.57上运行一个简单的基于Jersey的jaxrs侦听器。 Tomcat的context.xml中有一个jdbc数据源的全局配置,我想使用它 我的问题是,我无法通过@resource注释获取要解析的资源 下面是一个简单的测试示例 @Path("/") public class TestJersey { @Resource(name = "jdbc/default") private DataSource dsA; @Resource(na

我试图在现有的Tomcat7.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();
    }
}
此测试应用程序返回以下内容

A: null
B: null
C: null
D: null
1: org.apache.tomcat.jdbc.pool.DataSource@1518c95{ConnectionPool[d.....
所以jdbc连接是配置好的,可以通过显式的doLookup进行访问,那么为什么我不能让它使用@Resource注释呢

My apps 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>

测试
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.test
测试
/*
我花了一些时间寻找我做错了什么,但我找不到。我读过一些帖子,建议添加以下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>

数据库连接
jdbc/default
javax.sql.DataSource
容器
为了完整性起见,我的maven依赖项只是:

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

org.glassfish.jersey.containers
jersey容器servlet
2.19
似乎需要某种程度的CDI是正确的

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

首先,您需要一个CDI管理器,它是其中之一,因此我们需要在pom中为此提供一个依赖项

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

org.jboss.weld.servlet
所以你需要一个适配器

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

org.glassfish.jersey.containers.glassfish
因此,我们需要再添加一个,以避免对每个请求进行两页堆栈跟踪

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

javax.transaction
javax.transaction-api
1.2
因此,现在您已经准备好了所有的代码,您需要做最后一件事使其实际工作

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

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


希望这对其他人有所帮助

您可能想尝试一下,谢谢“Apache Tomcat是另一个Servlet容器,已知它可以很好地与Jersey CDI支持配合使用。但是,这些都不是现成的。您需要在Tomcat中启用CDI支持,例如使用Weld”。将有一个阅读和播放,看看它是否有帮助。我认为您必须用artifactId“jersey gf cdi”替换依赖项。资料来源:
<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>javax.transaction-api</artifactId>
    <version>1.2</version>
</dependency>