2015-02-09 5 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. Как мне это сделать? Я пробовал аннотировать метод с квалификаторами, но я получаю «тип аннотации, не применимый к такому виду декларации» -error.

ответ

3

Первое замечание, даже если оно может работать (я никогда не тестировал), я бы не рекомендовал определять классификатор как внутренние статические классы. В вашем случае есть даже нестатический класс, поэтому я не вижу, как вы могли их использовать. Чтобы сделать вашу жизнь проще, сделайте свой класс верхнего уровня квалификатора в своем приложении.

Второй момент, классификаторы могут быть применены по типу, метод параметра и поле так, правильно цель была бы:

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

Это происхождение вашей ошибки на пути

Итак, чтобы подвести итоги здесь является правильное определение для классификаторов

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

и

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

, поскольку они принимают METHOD в качестве цели, вы можете применить их к вашим продюсерам

Смежные вопросы