В моем 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
Насколько я знаю Tomcat не дает вам никакой поддержки CDI - какие библиотеки делать вам включить использование CDI? (Я пробовал это один раз, но без везения.) –
Я использую библиотеку 'javaee-web-api' с областью' provided' в моем pom. Странная часть состоит в том, что '@ Resource' работает с сервлетами. – user2325154
Вы пытались вручную искать ресурс с помощью JNDI api? Если вы можете получить его таким образом, то это контейнер, который закручивается. В противном случае что-то не так с вашей конфигурацией/кодом – kolossus