带有限定符的生产者方法
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
作为目标,您现在可以将它们应用于您的生产者
我目前正在学习 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
作为目标,您现在可以将它们应用于您的生产者