【问题标题】:Cannot connect to datasource using @Resource DI in Tomcat 8无法在 Tomcat 8 中使用 @Resource DI 连接到数据源
【发布时间】:2017-01-09 15:42:27
【问题描述】:

我想打印 JSP 页面上表中所有行的计数。类似的东西:

Total Products: 102

但是我在尝试从数据源获取连接时收到NullPointerException

Tomcat 8 是否支持 @Resource 依赖注入?

在一些在线博客中,它看起来受到支持并且可以正常工作。下面的链接。 https://www.mkyong.com/tomcat/how-to-configure-mysql-datasource-in-tomcat-6/

例外:

Stacktrace:] with root cause
 java.lang.NullPointerException
    at com.study.crud.dao.jdbc.impl.ProductDao.getProducts(ProductDao.java:31)
    at org.apache.jsp.jsp.home_jsp._jspService(home_jsp.java:135)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

META-INF/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/product-manager-mvc1-webapp">
    <!-- PostgreSQL Datasource -->
    <Resource auth="Container" driverClassName="org.postgresql.Driver" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" maxActive="50" maxIdle="10" maxWait="-1" name="jdbc/product-db-v1" password="def" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/product-db-v1" username="abc"/>
</Context>

ProductDao.java

public class ProductDao {

    @Resource(name = "jdbc/product-db-v1")
    private DataSource dataSource;

    public ProductDao() {
    }

    public List<Product> getProducts() throws SQLException {
        List<Product> products = QueryExecutor.getAllProducts(dataSource.getConnection());
        return products;
    }

}

home.jsp

<%
    ProductDao productDao = new ProductDao();
    List<Product> products = productDao.getProducts();
    LOG.debug("products = " + products);
    int productCnt = 0;
    if (products != null) {
        productCnt = products.size();
    }
%>

<body>
    <h1>Resource Injection Demo</h1>
    <h3>Product Count: <%= productCnt%></h3>
</body>

【问题讨论】:

标签: java jsp tomcat jakarta-ee dependency-injection


【解决方案1】:

Tomcat 8 当然支持使用@Resource 注解注入 DataSource 对象。

它不适合您,因为您正在使用 new 运算符创建ProductDao。注入仅在容器控制包含对象的生命周期时发生。

在 Tomcat 案例中,这意味着您可以将 @Resource 注入到 servlet、侦听器、过滤器等。Tomcat 不知道如何注入 ProductDao,因为正如其他人提到的,您需要一个完整的 Java EE 服务器实现(或使用 Spring 框架)。

如果这是一个学习练习,那么您可以通过在 GlassFish、Apache TomEE 或 WildFly(又名 JBoss)等开源 Java EE 实现中进行尝试获得很多收益,您可以将 ProductDao 注入其中一个 servlet,它将加载数据并随后转发到您的 JSP。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2020-12-03
    • 2010-12-16
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多