我目前正在通过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。
答案 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
作为目标,你现在可以将它们应用于你的制作人