gpt4 book ai didi

java - 无法在 Tomcat 8 中使用 @Resource DI 连接到数据源

转载 作者:行者123 更新时间:2023-11-30 07:59:30 25 4
gpt4 key购买 nike

我想在 JSP 页面上打印表格中所有行的计数。这种东西:

Total Products: 102

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

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

在某些在线博客中,它看起来受支持并且可以正常工作。下面的链接。 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>

最佳答案

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

它对您不起作用,因为您正在使用 new 运算符创建 ProductDao。仅当容器控制包含对象的生命周期时才会发生注入(inject)。

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

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

关于java - 无法在 Tomcat 8 中使用 @Resource DI 连接到数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39276890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com