我創建了一個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文件夾作爲項目的根文件夾。
下面是豆(會話,會話工廠和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
這__should__工作,所以你的設置中有什麼錯誤。你確定這個罐子是否包含在戰爭中?您是否更改了註釋的名稱(限定符)?你是否在jar項目中創建了一個新的簡單bean,並試圖在戰爭中注入它。那樣有用嗎? – Guenther
是的,我已經嘗試過。稍後重試我找到了解決方案─我將** beans.xml **放置在項目**根文件夾**中的META-INF文件夾中,並且它工作正常!這與WELD文檔中有關如何使用CDI bean工作的描述是一致的,這裏提到放豆的地方。xml在src/main/resources/META-INF中,但沒關係。無論如何,謝謝Guenther。 –
請看看你的'''beans.xml'''。它是否指定'''bean-discovery-mode =「註釋」''',如果是,註釋生產者類,至少使用''ApplicationScoped''' – maress