Jsf 2 @在Tomcat Web容器中注入数据源时资源注释不起作用

Jsf 2 @在Tomcat Web容器中注入数据源时资源注释不起作用,jsf-2,jsf-2.2,tomcat8,Jsf 2,Jsf 2.2,Tomcat8,我正在开发一个小型Web应用程序,使用一个轻量级的TomcatWeb容器8.5.4、JSF2.2.9和MySql 在OrdersBean类中,我试图使用@Resource注释注入数据源 @ManagedBean(name="orders") @SessionScoped public class OrdersBean { //resource injection @Resource(name="jdbc/tcomdb") private DataSource ds;

我正在开发一个小型Web应用程序,使用一个轻量级的TomcatWeb容器8.5.4、JSF2.2.9和MySql

在OrdersBean类中,我试图使用@Resource注释注入数据源

@ManagedBean(name="orders")
@SessionScoped
public class OrdersBean {

   //resource injection
   @Resource(name="jdbc/tcomdb")
   private DataSource ds;

   public List<Orders> getOrderList() throws SQLException {

       if(ds == null)
           throw new SQLException("Cannot retrieve Data Source ds");

       //get database connection
       Connection con = ds.getConnection();
       //...
   }
web.xml

<resource-ref>
  <description>MySQL Datasource example</description>
  <res-ref-name>jdbc/tcomdb</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

<!-- JSF mapping -->
<servlet>
   <servlet-name>Faces Servlet</servlet-name>
   <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>

MySQL数据源示例
jdbc/tcomdb
javax.sql.DataSource
容器
Facesservlet
javax.faces.webapp.FacesServlet
1.
context.xml中的MySql数据源配置

<Context>
   <Resource name="jdbc/tcomdb" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="passwd" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/tcomdb"/>
</Context>

我认为自版本发布以来,依赖项注入在TomcatWeb容器中工作。6/7如变更日志所示:

有人能证实吗?如果Tomcat确实支持,那么我的代码/配置有什么问题

我还想知道TomcatWeb容器在两种情况下如何在内部创建数据源对象:依赖项注入和上下文查找


请解释。

您在web.xml中指定了什么servlet版本?您如何初始化
OrdersBean
?默认的cdi配置是什么<代码>所有,
注释
?@Thorbjørnravandersen Servlet版本是jsf 2.2所需的3.0版本。9@Kukeltje在变量声明级别使用注入的资源有什么意义?资源注入允许将JNDI命名空间中可用的任何资源注入任何容器管理的对象,如企业bean或托管bean。正如您在代码OrdersBean类中看到的,我使用getOrdersList()方法中的DataSource来检索Orders结果集。但是我的问题仍然没有得到回答,为什么注入的数据源没有得到初始化?@Kukeltje在对stackoverflow和google做了足够的研究之后,我把这个问题放在这里,并且还在解决。说问题可能在web容器上只是一种逻辑思维,而不是结论。是的@Resource是JSR250中定义的常见注释,而不是CDI,谢谢。
<Context>
   <Resource name="jdbc/tcomdb" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="passwd" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/tcomdb"/>
</Context>