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 が発生する場合:

フィールド注入は、初期化ブロックとコンストラクターが実行された後に発生します。その後、フィールドは null ではなくなります。前にフィールドを参照すると、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サポートは、前述のカスタム インジェクションを使用して、 MemberInjector を介して実装されます。

私見:ロガーを注入しても、単純な単純な静的フィールドよりも余分な手間がかかることを保証するのに十分な付加価値は提供されませんが、やはりymmvです。

于 2013-05-29T10:42:50.347 に答える
0

ロガー ApplicationContext または BeanPostProcessor を初期化したかどうかはわかりません。このリンクはあなたに役立つかもしれません:

Java アノテーションを使用してロガーの依存関係を注入する

于 2013-05-29T01:27:43.163 に答える