【问题标题】:Producer method with Qualifier带有限定符的生产者方法
【发布时间】:2015-02-09 08:28:06
【问题描述】:

我目前正在学习 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。我该怎么做呢?我尝试使用限定符对方法进行注释,但出现“不适用于此类声明的注释类型”-错误。

【问题讨论】:

    标签: cdi java-ee-7


    【解决方案1】:

    首先,即使它可能有效(我从未测试过),我也不建议将限定符定义为内部静态类。在您的情况下,甚至还有非静态类,所以我看不出您如何使用它们。 为了让您的生活更简单,请在您的应用程序中创建两个限定符顶级类。

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

    @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 作为目标,您现在可以将它们应用到您的制作人

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 2016-06-26
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2018-04-28
      相关资源
      最近更新 更多