1

我将此添加到我的项目 POM 中:

    <dependency>
        <groupId>org.apache.onami.logging</groupId>
        <artifactId>org.apache.onami.logging.log4j2</artifactId>
        <version>3.4.0-incubating</version>
    </dependency>

@InjectLogger

@InjectLogger
Logger logger;

logger.info("Created"); // NPE here.

可能是什么问题呢?

4

2 回答 2

1

您必须安装新的 Log4j2LoggingModule( Matchers.any() )。看

http://onami.incubator.apache.org/logging/log4j2.html

我个人更喜欢带有 logback 但 ymmv 的 slf4j。

如果你仍然得到 NPE:

字段注入发生在初始化块和构造函数运行之后。只有在那之后,这些字段才会不为空。如果您之前引用字段,那么您将获得 NPE。方法注入发生在字段注入之后。您可以使用方法注入来模拟 @PostConstruct 或使用专用注释,例如onami-lifecycle

@InjectLogger Logger log;

CtorInjectedStuff stuff;

@Inject Foo(CtorInjectedStuff stuff){
    this.stuff = stuff;
    log.info("created"); // null as fields are not yet injected
}     

@Inject public void postConstruct(){
    log.info("post construct"); // works
}

可悲的是你不能做

@Inject Foo(CtorInjectedStuff stuff, @InjectLogger Logger log){
    ...
}   

因为自定义注入仅在创建实例后才起作用

注意:@InjectLogger 支持是通过MembersInjector使用前面提到的自定义注入实现的。

恕我直言:注入记录器并不能提供足够的附加值来保证在简单的静态字段上的额外麻烦,但又是 ymmv。

于 2013-05-29T10:42:50.347 回答
0

我不确定您是否已初始化记录器 ApplicationContext 或 BeanPostProcessor。此链接可能对您有所帮助:

使用java注解注入logger依赖

于 2013-05-29T01:27:43.163 回答