標籤:j2ee context depedency in cdi aop
本篇部落客要介紹,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
J2EE CDI beans部署在獨立的jar包中