簡単な作業だと思ったものをまとめるのに少し苦労しています。ステートレスシングルトンBeanがあり、アプリの「ローダー」として使用します。BeanはJar(loader.jar)ファイルに含まれており、私のEARのlibフォルダーにあります。
EARのルートには、アプリケーションで使用されるステートレスセッションBeanの実装を含む別のjarがあります。
次に、log4jを実際にラップする小さなロガークラスを作成しました。
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Named;
import org.apache.log4j.Logger;
public class LoggerFactory {
private Logger logger;
public LoggerFactory(){
logger = Logger.getLogger(this.getClass().getName());
}
@Produces Logger getLogger(InjectionPoint caller){
return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
}
}
次に、これをutils.jarという名前のjar内に配置しました。このjarでは、CDI仕様に従って、META-INFフォルダー内に空のbeans.xmlファイルを作成しました。utils.jarは、私のEARのlibフォルダーにあります。
さて、私が前に述べたステートレスシングルトンBean(ローダー)
私はこれだけを書いた
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
import org.apache.log4j.Logger;
@Startup
@Singleton
public class Core {
@Inject
private Logger logger;
@PostConstruct
void init(){
logger.info("Core started");
}
}
アプリをglassfish3.1.2にデプロイすると、ローダーBeanでロガーを最初に呼び出したときにプレーンなNPEが取得されます。これにより、CDIの呼び出しはまったく行われていないと思いますが、私は自分が間違っていることを心から理解しています。
これまでのところ、私のEAR構造は次のとおりです。
EAR
|
+---lib
| +--loader.jar
| +--utils.jar
| +--log4j.xx.jar
|
+--MyStatelessSessionBean.jar
あなたの助けをどうもありがとう