簡體   English   中英

無法在Tomcat 8中使用@Resource DI連接到數據源

[英]Cannot connect to datasource using @Resource DI in Tomcat 8

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

Tomcat 8當然支持使用@Resource批注注入DataSource對象。

它對您不起作用,因為您正在使用new運算符創建ProductDao 僅當容器控制包含對象的生命周期時才進行注入。

在Tomcat的情況下,這意味着您可以對servlet,偵聽器,過濾器等執行@Resource注入。Tomcat不知道如何注入ProductDao,因為正如其他人提到的那樣,您需要一個完整的Java EE服務器實現(或使用Spring框架)。

如果這是一個學習練習,那么您可以在其中一種開源Java EE實現(例如GlassFish,Apache TomEE或WildFly(又名JBoss))中嘗試該方法,從而從中受益匪淺,在那里您可以將ProductDao注入到一個將加載數據並隨后轉發到您的JSP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM