2

我有一个使用 Jersey3 的 Tomcat 10、Java11 的 WebApp。我在我的数据库中定义了一个 ConnectionPoolcontext.xml来处理与我的 OracleDB 的连接,现在我正试图通过@Resource注释访问我的控制器中的数据源。这应该调用 JNDI 查找。不幸的是,我总是得到一个 NPE,因为它似乎在运行时找不到资源......我做错了什么?或者正确的映射名称/查找是什么?

  @Path("/data")
public class DataController  {

    @Context
    ServletContext context;

    @Resource(lookup = "java:/jdbc/myDB") //also tried java:/comp/env/jdbc/myDB and mappedName="jdbc/myDB"
    protected DataSource ds; //always null
<Context name="myapp">
<Resource type="javax.sql.DataSource"
          name="jdbc/myDB"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@//localhost:1521/orcl"
          username="xy"
          password="xy"/>

根据教程,当我直接在 context.xml 中定义资源时,引用链接是可选的。

感谢您的任何意见!

4

1 回答 1

3

这个链接是关于 jboss 的,但对你来说似乎也很相关。它说,根据规范,进行 JNDI 查找的资源注释仅适用于 EJB,因此不适用于您的情况。

一种解决方法是通过编程方式查看您的数据源是否正常工作:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource bean = (DataSource ) envCtx.lookup("jdbc/myDB");

如果你能找到你的数据源,你可以尝试优化以避免上面的“手动”查找。

于 2021-02-16T15:45:39.653 回答