サービスを利用するロガークラスがあります。新しいロガーが作成されるたびに、シングルトンスコープのロギングサービスにアクセスできると期待しています。
ロギングサービスをロガーに自動配線していますが、nullポインタ例外が返されます。私はいくつかの解決策を試しました:
私はこれを私のjunitテストで機能させようとしていますが、別のアプリケーションコンテキストを利用するためにコンテキストファイルを指定しています。ただし、同一に保っても問題は解決しません。
以下のコードを見つけてください:
以下は、アプリケーションコンテキストからの抜粋です。
<context:component-scan base-package="com.platform"/>
<bean id="asyncLoggingService" class="com.platform.services.AsyncLoggingServiceImplementation" scope="prototype"/>
以下はLoggerクラスです。
package com.platform.utils;
import com.platform.services.AsyncLoggingService;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class OurLogger
{
private static Logger logger;
@Autowired
private AsyncLoggingervice asyncLoggingService;
public OurLogger(Class Clazz)
{
logger = LoggerFactory.getLogger(Clazz);
}
public void trace(TraceableObject object, String message)
{
//Do nothing yet
}
}
次に、別のサービスでロガーを利用して、何が起こっているのかをログに記録します。 (別のロガーを作成している理由は、RabbitMQサーバーを利用するためです)サービスでは、ロガーの新しいインスタンスをインスタンス化し、それに応じて使用します。
@Service
public class AsyncAccountServiceImplementation implements AsyncAccountService
{
private static final String GATEWAY_IP_BLOCK = "1";
private static OurLogger logger = new OurLogger(AsyncAccountServiceImplementation.class);
...
}
OurLogger
でメソッドを呼び出そうとすると、asyncLoggingService
でnullポインターが発生します。
次に、JUnitを使用してAsyncAccountService
をテストしようとしています。別のアプリケーションコンテキストを確実に追加しますが、それでもnullポインター例外が発生するようです。
さらに情報が必要な場合はお知らせください。私はこれを修正する方法を見てきましたが、それらは機能していないようですので、おそらくどこかで間違いを犯したか、これをすべて正しく理解していない可能性があります。
ちょうど私の2セントを追加したいです。
the life in the IoC world
に慣れていないときに同じ問題が発生しました。いずれかのBeanの@Autowired
フィールドが実行時にnullになります。
根本的な原因は、Spring IoCコンテナ(@Autowired
フィールドがindeed
が適切に挿入されている)によって維持される自動作成Beanを使用する代わりに、私がnewing
その豆とそれを使用しています。もちろん、このフィールドの@Autowired
フィールドはnullです。これは、Springが挿入する機会がないためです。
AspectJを使用している場合は、@Configurable
:
@Configurable
public class OurLogger {
..
}
アプリケーションコンテキスト内で、ロガーを参照する必要があります。
<context:component-scan base-package="com.platform"/>
<bean id="asyncLoggingService" class="com.platform.services.AsyncLoggingServiceImplementation" scope="prototype"/>
<bean id="ourLogger" class="com.platform.utils.OurLogger"/>
次に、それをサービスに注入する必要があります。
@Service
public class AsyncAccountServiceImplementation implements AsyncAccountService
{
private static final String GATEWAY_IP_BLOCK = "1";
@Autowired
private OurLogger logger;
}
Spring Beanを注入するには、JUnitテストではなくSpringフレームワークのユニットテストを使用します。
それはあなたを助けるかもしれません。