2016-08-24 49 views
4

我創建了一個Java項目作爲其他項目的lib,減少了項目之間的代碼重複。這個lib項目被導出到jar被包含在Web項目中(WAR,而不是EAR)。容器中找不到.jar中的CDI bean(不滿意的依賴關係)

在Web項目中(這些類被刪除),一切正常,而所有類都保留在它們上面 - 簡單和複雜對象(包含生產者和設置)的注入正常工作。

在刪除這些Web項目的類並將具有相同類的jar添加到Web項目(在Maven項目的pom.xml中設置此lib)之後,所有內容都正常編譯,就像以前一樣。但在啓動服務器,類(CDI豆)現在存在於罐子不是由容器CDI的啓動過程中發現,這產生(著名)的錯誤:

WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...) 

已加入的beans.xml中在在src/main/resources(在WELD和CDI文檔中指出)中的META-INF文件夾作爲項目的根文件夾。

enter image description here

下面是豆(會話,會話工廠和ExampleLogger)的例子呈現在需要被注入到其它項目的jar(並已正常工作,而類是在Web項目),但現在是由CDI發現:在Maven項目和非Maven項目發生

public class HibernateConnectionFactory { 

    @Produces 
    @ApplicationScoped @ConnectionBaseExample 
    public SessionFactory createSessionFactoryExample() { 
     Configuration configuration = new Configuration(); 
     configurarSessionFactory(configuration, "baseExampleDS"); 
     ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 

     return configuration.buildSessionFactory(registry); 
    } 

    @Produces 
    @RequestScoped @ConnectionBaseExample 
    public Session createSessionExample(@ConnectionBaseExample SessionFactory sessionFactory) { 
     return sessionFactory.openSession(); 
    } 

    public void destruirSessionExemplo(@Disposes @ConnectionBaseExample Session session) { 
     if (session.isOpen()) { 
      session.close(); 
     } 
    } 
} 
public class ExampleLoggerProducer { 

    @Produces 
    public ExampleLogger createLogger(InjectionPoint injectionPoint) { 
     return new ExampleLogger(injectionPoint.getMember().getDeclaringClass()); 
    } 
} 

的問題也是如此。有沒有人遇到過這個問題?有沒有人知道在容器中找到的罐子中存在的豆子的解決方案?預先感謝您,併爲糟糕的英語感到遺憾。

的Java EE7,CDI 1.1,WELD 2.1,服務器WildFly 8.1

+1

這__should__工作,所以你的設置中有什麼錯誤。你確定這個罐子是否包含在戰爭中?您是否更改了註釋的名稱(限定符)?你是否在jar項目中創建了一個新的簡單bean,並試圖在戰爭中注入它。那樣有用嗎? – Guenther

+0

是的,我已經嘗試過。稍後重試我找到了解決方案─我將** beans.xml **放置在項目**根文件夾**中的META-INF文件夾中,並且它工作正常!這與WELD文檔中有關如何使用CDI bean工作的描述是一致的,這裏提到放豆的地方。xml在src/main/resources/META-INF中,但沒關係。無論如何,謝謝Guenther。 –

+1

請看看你的'''beans.xml'''。它是否指定'''bean-discovery-mode =「註釋」''',如果是,註釋生產者類,至少使用''ApplicationScoped''' – maress

回答

2

再次嘗試一點點時間前,我已經找到了解決方案─我把的beans.xml在META-INF文件夾中的內項目根目錄文件夾,它的工作!這與如何在WELD文檔的jar文件中使用CDI bean的描述相反,其中說beansize的放置位置在src/main/resources/META-INF中,但沒關係。也許在一些Maven項目中,這是真的。

[UPDATE]這是有效的,因爲我使用Eclipse的導出jar嚮導來構建jar,而不是使用Maven來執行此操作。使用Maven應該可以在src/main/resources/META-INF中的beans.xml中正常工作。

希望這可以幫助其他人在這種情況下。

+1

在這種情況下,資源在您的Maven安裝中處理的方式出了問題。也許你在你的pom中重新定義了資源是如何被複制的?在許多帖子中可以看到,如果你還沒有弄亂任何東西,那麼使用src/main/resource/META-INF/beans.xml進行記錄的設置就可以正常工作。 http://stackoverflow.com/questions/13056336/cdi-beans-xml-where-do-i-put-you – Guenther

+1

我認爲它的工作方式是這樣的,因爲你使用Eclipse來導出jar文件,而不是使用artefact由Maven構建。理想情況下,您將使用Maven構建分佈式文物,因爲這是一個可重複的過程,而Eclipse導出可能會根據用戶的個人設置而有所不同。 –

+0

@SteveC是對的。我正在構建使用Eclipse的導出jar嚮導,而不是使用Maven來執行此操作。使用Maven在指定位置使用beans.xml進行構建可以正常工作。謝謝你們,我非常感謝你們的幫助和關注! –

相關問題