带有限定符的生产者方法

Producer method with Qualifier

我目前正在学习 JavaEE7 教程,但遇到了一个我无法解决的练习。我必须使用限定符将我的日志记录分成技术日志和操作日志。这是我定义这些限定符的 class:

    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。我该怎么做呢?我尝试使用限定符注释该方法,但出现 "annotation type not applicable to this kind of declaration"-error.

首先,即使它可能有效(我从未测试过),我也不建议将限定符定义为内部静态 classes。在你的情况下甚至有非静态 class 所以我不知道你如何使用它们。 为了让您的生活更简单,请在您的申请中将您的两个限定词设为顶级 class。

第二点,限定符可以应用于类型、方法、参数和字段,因此正确的目标是:

@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 作为目标,您现在可以将它们应用于您的生产者