2015-02-09 74 views
0

我目前正在通過JavaEE7教程開展工作,並且參加了我無法解決的練習。我必須使用限定符將日誌記錄分成技術日誌和操作日誌。 Here's這裏我定義這些限定類:帶限定詞的生產者方法

import static java.lang.annotation.ElementType.FIELD; 
    import static java.lang.annotation.ElementType.PARAMETER; 
    import java.lang.annotation.Retention; 
    import static java.lang.annotation.RetentionPolicy.RUNTIME; 
    import java.lang.annotation.Target; 
    import javax.inject.Qualifier; 

/** 
* 
* @author jalexakis 
*/ 
public class Logs { 
    @Qualifier 
    @Target({FIELD, PARAMETER}) 
    @Retention(RUNTIME) 
    public @interface TecLog {} 

    @Qualifier 
    @Target({FIELD, PARAMETER}) 
    @Retention(RUNTIME) 
    public @interface OperationalLog{} 

} 

現在我要改變這種方法,

@Produces  
public Logger produceLog(InjectionPoint injectionPoint){ 
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName(), "messages"); 
} 

爲兩種方法,一個是@TecLog,一個用於@OperationalLog。我該怎麼做呢?我嘗試用限定符註釋該方法,但是我得到的「註釋類型不適用於這種聲明」 - 錯誤。

回答

3

第一句話,即使它可能工作(我從來沒有測試過),我不會推薦定義限定符作爲內部靜態類。在你的情況下,甚至有非靜態類,所以我不知道你如何使用它們。 爲了讓您的生活變得更簡單,在您的應用程序中使您的兩個限定符頂級課程。

二點,合格者可以在類型,方法,參數和現場應用,因此正確的目標將是:

@Target({ TYPE, METHOD, PARAMETER, FIELD }) 

由這樣

是你錯誤的根源所以總結起來這裏是你的預選賽

@Qualifier 
@Target({ TYPE, METHOD, PARAMETER, FIELD }) 
@Retention(RUNTIME) 
public @interface TecLog { 
} 

正確的定義

因爲他們接受METHOD作爲目標,您現在可以將它們應用於您的生產商