2015-09-02 1 views
1

В моем JSF управляемого компоненте (HomePageController.java) Я пытаюсь получить соединение с базой данных с помощью @Resource аннотацию, но она остается null по какой-то причине и во время отладки я обнаружил, что это дает NullPointerException ,не в состоянии получить DB соединение с помощью CDI в JSF Managed боба

Я использую сервер Tomcat 8. Может быть, потому, что Tomcat 8 не является полнофункциональным контейнером Java EE?

Я уже определить источник данных в META-INF/context.xml файл

<?xml version="1.0" encoding="UTF-8"?> 
<Context antiJARLocking="true" path="/ministore-jsf-mvc"> 
    <!-- PostgreSQL Datasource --> 
    <Resource auth="Container" driverClassName="org.postgresql.Driver" 
       factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" 
       maxActive="50" maxIdle="10" maxWait="-1" 
       name="jdbc/ministore-db" password="postgres" 
       type="javax.sql.DataSource" 
       url="jdbc:postgresql://db-server:5432/ministore-db" username="postgres"/> 
</Context> 

web.xml фрагмент

<!-- DB configuration (using Datasource) --> 
<resource-ref> 
    <description>PostgreSQL Datasource</description> 
    <res-ref-name>jdbc/ministore-db</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 

HomePageController.java

@ManagedBean 
@RequestScoped 
public class HomePageController implements Serializable { 

    private static final Logger LOG = Logger.getLogger(HomePageController.class); 

    @Resource(name = "jdbc/ministore-db") 
    protected DataSource dataSource; 

    public Product getProduct() { 
     LOG.debug("Into the HomePageController..."); 

     //get the Product object based on productId parameter 
     Product product = null; 

     try { 
      product = new MasterDao(dataSource).getProduct(DEFAULT_PRODUCT_ID); 
      LOG.debug("product = " + product); 
     } catch (Exception e) { 
      LOG.error("Exception while getting product from DB for productId = " + DEFAULT_PRODUCT_ID); 
      LOG.error(e.getMessage()); 
     } 
     LOG.debug("product = " + product); 
     return product; 
    } 

} 

Выход:

DEBUG com.ministore.controllers.HomePageController - Into the HomePageController... 
ERROR com.ministore.controllers.HomePageController - Exception while getting product from DB for productId = 101 
ERROR com.ministore.controllers.HomePageController - 
DEBUG com.ministore.controllers.HomePageController - product = null 
+0

Насколько я знаю Tomcat не дает вам никакой поддержки CDI - какие библиотеки делать вам включить использование CDI? (Я пробовал это один раз, но без везения.) –

+0

Я использую библиотеку 'javaee-web-api' с областью' provided' в моем pom. Странная часть состоит в том, что '@ Resource' работает с сервлетами. – user2325154

+0

Вы пытались вручную искать ресурс с помощью JNDI api? Если вы можете получить его таким образом, то это контейнер, который закручивается. В противном случае что-то не так с вашей конфигурацией/кодом – kolossus

ответ

0

Попробуйте

@Resource(name = "java:/comp/env/jdbc/ministore-db") 

удалить Также factory атрибут из файла контекста

+0

Не повезло. Еще одна ошибка :( – user2325154

+0

Попробуйте инициализировать его с помощью bean-конструктора, затем uisng 'InitialContext.doLookup (name: String): Object', также перезагрузите сервер. –

+0

Также я не уверен, но если вы находитесь в Linux, файл контекста должен быть 'Context.xml' (с верхним C) –

Смежные вопросы