2013-07-25 45 views
-1

雖然具有用於CDI支持一個自定義的限定如下:CDI/WELD可以將自定義限定符與@Named註釋組合使用嗎?

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface QualifiedFooBean { 
} 
@QualifiedFooBean 
public class FooBean implements ImplFooBean { 
} 
public interface ImplFooBean { 
} 

我要綁定FooBean#{fooBean}直接而不需要一個包裝或處理器(從這example看到的)。註釋「Named」(在類FooBean中)似乎不適用於我的類佈局。

我的解決方案(不含包裝),我不知道爲什麼它不工作和調用:目標不可達,標識符「fooBean」解析爲空

@Named 
@QualifiedFooBean 
public class FooBean implements ImplFooBean { 
} 

有任何人任何想法?

回答

1

包裝是不需要的。我的解決方案非常有效。它也允許添加一個自定義限定符(在我的情況下是QualifiedFooBean)的組合。我不得不在WEB-INF文件夾中創建一個空的beans.xml文件以獲得CDI的工作。無論如何這個問題本身解釋了自定義限定符如何工作。您也可以預填的beans.xml有以下內容:

<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

</beans> 

它將成爲未來使用的骨架,如果你需要與CDI配置更多花哨的東西。

+0

CDI沒有被激活@maglebolia所以你爲什麼說包裝解決方案爲你工作。尋求幫助時最好提供有效的信息。 –

+0

這是因爲我對網上看到的例子總是帶有包裝的信心,我只是認爲它可以工作。但是我明白了實際解釋我的情況,而不是做出假設。無論如何,謝謝你的時間。 –

-1

@Named添加到您的bean應該工作:它適用於我。

In事實@Named是一個限定符,當JSF解析Bean以顯示它時,會執行基於@Named限定符的lokup。在CDI中,如果查找方(即注入點)要求其限定符的一個子集,則找到一個bean。

例如一個bean資格這樣的:

@QualifiedFooBean 
@SecondQualifier 
public class FooBean {} 

會發現(如果沒有含糊分辨率)由

@Inject 
@SecondQualifier 
FooBean bean; 

甚至:

@Inject 
FooBean bean; 

但不通過

@Inject 
@SecondQualifier 
@ThirdQualifier 
FooBean bean; 

因此,您可以添加@Named限定符,並讓CDI解析引擎完成其工作。

+0

我已更新我的問題,以更好地反映我的問題。 @Antoine:在創建自定義限定符之前,我有不明確的警告。他們走了......命名和默認作品的組合,但它似乎失敗時,它實際上是一個costum限定符命名+ QualifiedFooBean –

+0

你有堆棧跟蹤?你有沒有嘗試把你的bean放在RequestScope中(就像它是依賴的,並且是每次請求創建的) –