如何解决带有资源注释的 JNDI 查找始终为 NULL
我有一个带有 Tomcat 10 的 WebApp,使用 Jersey3 的 Java11。
我在 context.xml
中定义了一个 ConnectionPool 来处理与 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 中定义资源时,ref-link 是可选的。
感谢您的任何意见!
解决方法
This link 是关于 jboss 的,但似乎也与您有关。它说根据规范,进行 JNDI 查找的资源注释仅适用于 EJB,因此不适用于您的情况。
一种解决方法是以编程方式查看您的数据源是否正常工作:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource bean = (DataSource ) envCtx.lookup("jdbc/myDB");
如果你能找到你的数据源,你就可以尝试优化以避免上面的“手动”查找。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。