TomEE Embedded:在webapp中不可用在resources.xml中定义的资源

时间:2019-07-10 11:34:33

标签: datasource jndi tomee openejb tomee-7

我目前正在尝试在 TomEE Embedded (TomEE版本7.0.5)上运行一个简单的Web应用程序。

根据docs,我可以启动TomEE并将类路径部署为这样的Web应用程序。我已将文档库设置为src/main/webapp

try (final Container container = new Container(new Configuration())
                                      .deployClasspathAsWebApp("", new File("src/main/webapp"))) {
    container.await();
}

我在WEB-INF/resources.xml中定义了一个数据源,如下所示:

<Resource id="myDataSource" type="javax.sql.DataSource">
    JdbcDriver org.hsqldb.jdbcDriver
    JdbcUrl jdbc:hsqldb:file:hsqldb
    UserName sa
    Password
</Resource>

我已经在web.xml中设置了一个引用:

<resource-ref>
  <res-ref-name>myDataSource</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
</resource-ref>

然后,我尝试通过JNDI在Servlet中查找此数据源。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  try {
    Context initCtx = new InitialContext();
    DataSource ds = (DataSource) initCtx.lookup("java:comp/env/myDataSource");
    Connection connection = ds.getConnection();    
    ...
}

TomEE启动时,好像我的数据源已创建(至少在日志中有一些输出)。但是,当我尝试在servlet中查找数据源时,我得到了一个未配置的dbcp2连接池作为数据源,当调用ds.getConnection()时会引发以下异常:

java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2186)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2066)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1525)
    at TestServlet.doGet(TestServlet.java:32)
    ...

在独立的TomEE(我尝试过TomEE Webprofile)上或使用TomEE Maven插件时,相同的配置可以正常工作。我还有什么需要让它同时运行于嵌入式TomEE的吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

Tomee Embedded默认情况下不绑定自定义Webapp类加载器,因此没有始终绑定comp /。您可以将属性传递给上下文以强制其为openejb一种,或使用openejb:Resource / myDataSource或java:openejb / Resource / myDataSource命名。