【问题标题】:Tomcat 7 Datasource injection mechanismTomcat 7 数据源注入机制
【发布时间】:2014-07-25 06:31:32
【问题描述】:

我正在尝试创建简单的网络应用程序。并坚持数据源注入。似乎有几个问题。所以我将从我的困惑开始。据我了解,将 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>

@Resource 示例

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

我的困惑: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" 
/> 

【问题讨论】:

  • 您的 web.xml 是否表明您使用的是 servlet 3.0?
  • 在 servlet 中使用数据源是 Bad Pactise™。至少创建一个 DAO。就个人而言,我使用 Controller->Service->DAO 方法。它增强了代码的可读性、可维护性和模块化。
  • @MarkusWMahlberg 我的问题是关于技术,而不是实践。我只是想知道为什么它不起作用。而且,如果它能让你感觉更好,我确实在其他应用程序中有 DAO 层。 :-)
  • 请添加Tomcat数据源配置。
  • 你使用的是什么版本的Tomcat 7?

标签: java servlets tomcat7 web.xml


【解决方案1】:

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

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws     ServletException, IOException {
    }
}

这在我使用 Tomcat 7.0.50 进行的本地测试中有效。如果您正在寻找无注释的方法,我还没有得到它的工作,即使它应该给他们的 changelog1

编辑

我仍然没有找到解决方案,但我很好奇为什么这不起作用,所以我查看了injection-target 代码。我发现它首先加载了context.xml 条目,并且确实从web.xml 中获取了设置,但是选择不覆盖它在context.xml 中找到的配置,因为它已经看到了jdbc/MyDB 条目。我不确定如何将injection-target 设置转换为context.xml 或将driverClassName 等数据库设置转换为web.xml

【讨论】:

  • 谢谢!但我知道,这行得通:-)。问题是为什么 不起作用。
【解决方案2】:

据我所知,tomcat 是一个不错的 servlet 容器,但它不是一个完整的 Java EE 容器。从The BalusC Code: How to install CDI in Tomcat? 开始,我认为开箱即用的tomcat 无法进行任何依赖注入。 Tomcat 单独与 Spring 完美结合,因为它是轻量级的。

如果你不想使用 Spring,我上面写的链接应该会给你一些使用 tomcat 进行 CDI 的方法(TomEE 而不是 tomcat,WeldOpenWebBeans)。

编辑:

显然,最新版本的 tomcat 7 应该接受 DI - 请参阅下面 davidfmatheson 评论中的链接。

【讨论】:

  • Tomcat 不需要成为完整的 JEE 容器来支持 DI 进入托管类。我可以说更多:两个月前,我在 Jetty 中以两种描述的方式尝试了 DI。我记得这两种方式都有效。除此之外,我的网络应用程序非常简单,因此为 DI 包含任何其他框架是不合逻辑的。
  • @AleksandrKravets 我所说的只是任何 JEE 容器必须支持 DI。但我也阅读了 tomcat 文档,但找不到关于 DI 的内容。显然,tomcat 开发人员选择不实现它。
  • @SergeBallesta 不正确,请参阅 Tomcat 7 的更改日志:tomcat.apache.org/tomcat-7.0-doc/changelog.html。他们似乎完全支持 OP 正在尝试做的事情(搜索“injection-target”)。
  • @davidfmatheson 对了,我觉得我的tomcat版本有点老了,但是tomcat7.0的changelog这么多行,好像还没有完全稳定。
  • 这里问的不是DI而是RI,servlet 3.0支持。不需要完整的 EE 容器。
猜你喜欢
  • 2015-01-01
  • 2011-07-11
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多