2015-02-09 66 views
0

我目前正在通过JavaEE7教程开展工作,并且参加了我无法解决的练习。我必须使用限定符将日志记录分成技术日志和操作日志。 Here's这里我定义这些限定类:带限定词的生产者方法

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。我该怎么做呢?我尝试用限定符注释该方法,但是我得到的“注释类型不适用于这种声明” - 错误。

回答

3

第一句话,即使它可能工作(我从来没有测试过),我不会推荐定义限定符作为内部静态类。在你的情况下,甚至有非静态类,所以我不知道你如何使用它们。 为了让您的生活变得更简单,在您的应用程序中使您的两个限定符顶级课程。

二点,合格者可以在类型,方法,参数和现场应用,因此正确的目标将是:

@Target({ TYPE, METHOD, PARAMETER, FIELD }) 

由这样

是你错误的根源所以总结起来这里是你的预选赛

@Qualifier 
@Target({ TYPE, METHOD, PARAMETER, FIELD }) 
@Retention(RUNTIME) 
public @interface TecLog { 
} 

正确的定义

因为他们接受METHOD作为目标,您现在可以将它们应用于您的生产商