我试图在我现有的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();
}
}
此测试应用程序返回以下内容
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>
答案 0 :(得分:2)
看起来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日志记录
<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条目,但我没有发现我需要它,也许是为了注入自定义类?
希望这有助于其他人