2012-01-13 17 views
2

我有一些bean,在特定的注入中,我想添加一個給定的攔截器。如何在注入時指定攔截器

我天真地以爲有東西像一個@Interceptors註解,可以讓我寫

private @Interceptors(Logging.class, Connection.class) @Inject MyBean instance; 

不幸的是,Weld documentation明確指出相反。

那麼,我該如何注入我的bean的攔截版本?是否有可能使用cdi實例對象?

編輯

雖然LightGuard的answser真的是相關的,它不完全answser我的問題,所以讓我改一下吧。

我想要一個註釋觸發某種方法調用事件發送。爲此,我創建了一個CDI Interceptor,它具有自己的攔截器綁定(假設攔截器被稱爲SenderInterceptor,綁定被稱爲SenderBinding)。我現在想要的是添加CDI限定符(我們稱之爲SenderQualifier),當用於注射時,安裝SenderInterceptor

更清楚,我想下面的代碼使用SenderInterceptor

/* calling any method of that bean should trigger an event */ 
private @Inject @SenderQualifier MyBean aBean; 

,而這其中並不

private @Inject MyBean aBean; 

我試了一下,到目前爲止是

  • 檢測需要使用反射庫進行注射的領域(有效)
  • 使用縫焊創建一個AnnotatedType來自bean類(在BeforeBeanDiscovery事件期間)(該類型被創建,但不能與最初的類別區分開),並給出了攔截器綁定註釋AnnotatedType
  • 創建使用縫焊(再次)從產生AnnotatedType一個Bean,並給予它必要的註釋預選賽

一切似乎worrk,除了它的其中被注入原豆。

我當然可以用截取的一個取代原來的一個,但是在某些情況下不需要這種截取,所以我必須保留兩個AnnotatedType引用相同的具體類型。我以爲我在CDI上做了這些,但似乎並不奏效(因爲原始類型永遠不會被攔截的替換掉)。

回答

2

你需要做什麼:

  1. 添加攔截器beans.xml中,所以它激活
  2. 創建一個擴展來添加攔截器綁定或攔截註釋類型中ProcessAnnotatedType生命週期事件。您需要撥打getAnnotatedType,添加註釋,然後撥打setAnnotatedType。我強烈建議您查看AnnotatedTypeBuilderSeam SolderApache DeltaSpike項目,以使其更容易。
+0

我第一次聽說過這些項目。 +1以及它可以添加的方式。但是,我想我實際上應該在現有的類型旁邊添加類型,而不是簡單地替換它們。 – Riduidel 2012-01-17 09:44:33

+0

實際上,在我的情況下,應該在'BeforeBeanDiscovery'事件處理程序方法中使用'AnnotatedTypeBuilder'(因爲'ProcessAnnotatedType'允許類型添加,但只能替換類型)。 – Riduidel 2012-01-17 10:29:05

+0

對不起,@LightGuard,但我必須將您的答案標記爲非答覆。 – Riduidel 2012-01-17 13:29:25

0

可能,您可以嘗試@Inject MyInterceptedBean instance;,其中攔截器與MyInterceptedBean一起列出?

(警告:這並不看的權利,不過,使用繼承的類型,只有在不同的註解大概......當接受它總是兩個在每種情況下表示相同的註解,而不是不同的註解。)

+0

嗯,在我的情況下,我甚至不能使用它,因爲有些bean是通過其他CDI擴展([在此討論的JNDIExtension])的遠程連接(http://stackoverflow.com/a/8536437/15619)) – Riduidel 2012-01-16 16:06:42