使用限定符生成方法

时间:2015-02-09 08:28:06

标签: cdi java-ee-7

我目前正在通过JavaEE7教程,我来了一个我无法解决的练习。我必须使用限定符将我的日志记录拆分为技术日志和操作日志。这是我定义这些限定符的类:

    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。

1 个答案:

答案 0 :(得分: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作为目标,你现在可以将它们应用于你的制作人