2016-09-01 7 views
1

JSPページのテーブル内のすべての行の数を出力します。この種の何か:Tomcat 8の@Resource DIを使用してデータソースに接続できません

Total Products: 102 

データソースから接続を取得しようとしているときに、私はNullPointerExceptionを取得していますが。

@Resource dependency injectionはTomcat 8でサポートされていますか?

オンラインブログの中には、サポートされているように見えるものがあります。以下のリンク。 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> 
+0

同じ問題がここに記載されています。http://stackoverflow.com/questions/24040291/tomcat-7-datasource-injection-mechanism問題は、Tomcatが本格的なエンタープライズコンテナではないということです。 JBoss/Weblogic/TomEEの使用はこの問題を解決します。 – user2325154

答えて

2

にTomcat 8は確かに@Resourceアノテーションを使用してDataSourceオブジェクトの注入をサポートしています。

new演算子を使用してProductDaoを作成しているため、これは機能しません。注入は、コンテナが含まれているオブジェクトのライフサイクルを制御する場合にのみ発生します。

サーブレット、リスナー、フィルターなどに@Resource注入を実行できることを意味します。TomcatはProductDaoを挿入する方法を知らないため、他の人が触れたように完全なJava EEサーバー実装が必要です。その(またはSpringフレームワークを使用する)。

これが学習の練習であれば、GlassFish、Apache TomEE、WildFly(別名JBoss)などのオープンソースのJava EE実装の1つで、これを試すことで多くの利益を得ることができます。ここでProductDaoデータをロードし、その後JSPに転送するサーブレットに追加します。

関連する問題