J2EE CDI beans部署在独立的jar包中

             本篇博客主要介绍,CDI开发中,将所有的CDI Bean打包到一个jar包中,如何解决org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [...] with qualifiers [@...] at injection point ... 异常。


介绍

           在CDI项目中beans.xml的一个主要作用就是告诉容器我们所开发的CDI存在的位置,保证容器能够扫描到这些类文件。这篇博客主要介绍在一个独立的jar文件中如何配置才能够保证在web应用中的这些CDI Bean能够被加载进来。


开发环境

1.  Ubuntu 12.04

2  JDK 1.7.0.2.1

3  Weld 1.1.10

4 Tomcat 7.0.35


CDI JAR文件

            在上一篇博客中我们已经知道开发一个CDI web应用程序需要将beans.xml文件放到WEB-INF文件夹下以保证web容器能够扫描并加载这些CDI bean 类文件。而通常项目开发过程中我们会将这些CDI Beans打包到一个JAR文件中,放到web项目的WEB-INF/lib文件夹下使用,这样的话我们必须得保证容器知道这些CDI beans并去扫描跟加载这些类。解决这个问题的办法就是将beans.xml文件放到JAR文件下的META-INF文件夹下。


应用测试

             我们使用一个比较简单的web应用来测试这个方案。首先应用程序是一个多模块的maven项目,在web模块的war包中包含一个CDi模块。如果你不知道如何构建一个多模块的web应用程序,请参考How to create a multiple module project using Maven.


应用结构

     技术分享技术分享技术分享

    正如我们看到的,我们在META-INF文件夹下创建了一个beans.xml文件。当我们构建web模块时被引用的CDI模块会被引用到WEB-INF、lib文件目录下。由于CDI模块的jar包包含了beans.xml文件,容器就会知道去哪扫描这些CDI文件。

    CDI Service接口和它的实现类都包含在项目的lib目录下,这样实现类就可以注入到web应用模块中TestServlet的Servlet中。


错误配置结果

    如果我们没有将包含CDI beans的jar包正确的部署到相应的地方,在CDI初始化的时候找不到相应的依赖关系就会抛出初始化异常信息。如容器找不到任何的依赖注入的依赖关系就会抛出以下异常信息

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [Service] with qualifiers [@Default] at injection point ...

本文涉及到的源代码下载
java-ee-cdi-beans-deployed-in-external-library-web-inf-lib-jar-file.zip

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。