Tomcat 7数据源注入机制

Ale*_*ets 3 java web.xml servlets tomcat7

我正在尝试创建简单的网络应用程序.并坚持数据源注入.似乎有几个问题.所以我将从困惑开始.据我所知,有两种(至少)方法将DataSource注入Servlet:

  • web.xml中
  • @Resource

web.xml示例

<resource-ref>
    <res-ref-name>jdbc/MyDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <injection-target>
        <injection-target-class>ua.test.TestServlet</injection-target-class>
        <injection-target-name>dataSource</injection-target-name>
    </injection-target>
</resource-ref>
Run Code Online (Sandbox Code Playgroud)

@Resource示例

public class TestServlet extends HttpServlet{
    @Resource
    private DataSource dataSource;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws     ServletException, IOException {
Run Code Online (Sandbox Code Playgroud)

我的困惑:web.xml在我的简单项目中在Tomcat 7中不起作用.在我看来,web.xml选项应该工作,因为在Java 5之前没有注释.请解释.

更新:

数据源配置

<Resource name="jdbc/MyDB" 
          type="javax.sql.DataSource" 
          auth="Container"
          username="SA"
          password=""
          driverClassName="org.hsqldb.jdbcDriver"        
          url="jdbc:hsqldb:file:~/database/my_db" 
/> 
Run Code Online (Sandbox Code Playgroud)

dav*_*son 5

尝试取出注释中的injection-target条目web.xml并使用该name属性@Resource:

public class TestServlet extends HttpServlet {
    @Resource(name = "jdbc/MyDB")
    private DataSource dataSource;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws     ServletException, IOException {
    }
}
Run Code Online (Sandbox Code Playgroud)

这在我使用Tomcat 7.0.50的本地测试中起作用.如果你正在寻找没有注释的方法,那么即使它应该给出他们的更改日志1,我也没有这样做.

编辑

我还没有找到解决方案,但我很好奇为什么这不起作用所以我看了一下injection-target代码.我发现它首先加载context.xml条目,并从中获取设置web.xml,但选择不覆盖它找到的配置,context.xml因为它已经看到了一个jdbc/MyDB条目.我不知道如何让injection-target设置进入context.xml或DB设置,如driverClassNameweb.xml.