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

时间:2016-09-01 16:47:00

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

我想在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>

1 个答案:

答案 0 :(得分:3)

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

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

在Tomcat案例中,这意味着你可以对servlet,监听器,过滤器等执行@Resource注入.Tomcat不知道如何注入ProductDao,因为正如其他人提到的那样,你需要一个完整的Java EE服务器实现(或使用Spring Framework)。

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