本篇博客主要介绍,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