2016-09-01 2 views
1

JSP 페이지의 테이블에있는 모든 행 수를 인쇄하려고합니다. 이런 종류의 뭔가 : 데이터 소스에서 연결을 확보하는 동안 나는 NullPointerException을 얻고 그러나Tomcat 8의 @Resource DI를 사용하여 데이터 소스에 연결할 수 없습니다.

Total Products: 102 

.

@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; 
    } 

} 
012,351 6,

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

톰캣 8 확실히 @Resource 주석을 사용하여 데이터 소스 객체의 주입을 지원한다.

new 연산자를 사용하여 ProductDao을 생성했기 때문에 효과가 없습니다. 주입은 컨테이너가 포함 된 객체의 라이프 사이클을 제어 할 때만 발생합니다.

서블릿, 리스너, 필터 등에 @Resource 주입을 수행 할 수 있다는 것을 의미합니다. Tomcat은 ProductDao를 삽입하는 방법을 알지 못합니다. 다른 사람이 언급했듯이 완전한 Java EE 서버 구현이 필요하기 때문입니다. 그 (또는 스프링 프레임 워크를 사용).

학습 과정 인 경우 GlassFish, Apache TomEE 또는 WildFly (일명 JBoss)와 같은 오픈 소스 Java EE 구현 중 하나에서이 작업을 시도해 볼 수 있습니다. 여기에서 ProductDao 데이터를로드 한 다음 나중에 JSP로 전달하는 서블릿에 추가합니다.

관련 문제