私はここに来たばかりで、CDI の世界にも慣れていません。仕事で最初に受けた仕事は、CDI のアップロードを制御する方法を見つけることでした。
と の両方を使用してEJB 3.1
いCDI 1.0
ます。これらは異なるコンテナーによって制御されるため、@Startup
と@Singleton
アノテーションを使用して、EJB マネージド Bean を起動するタイミングと順序を制御できます。
しかし、@Inject
CDI コンテナーがまだ開始されていないため、クラスで宣言した CDI Bean が null になります。
私は解決策を探すために数日間試みてきましたが、ここで見つけたものは機能しませんでした (まだ null として来ました)。
Java EE 6 を使用し、WebSphere Application Server 8 でアプリケーションを実行しています。
EJB に関係なく、内部で CDI のアップロードを制御する方法を見つけるのを手伝ってくれませんか?
サンプルコードは次のとおりです。
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
@Singleton
@Startup
public class BaseStartupLoader{
/**
* Default constructor.
*/
@Inject @MyStartup
BaseStartUp myStartup;
private static Logger m_logger = LoggerFactory.getLogger(BaseStartupLoader.class);
public BaseStartupLoader() {
}
@PostConstruct
public void init(){
String applicationName = null;
try {
applicationName = myStartup.getClass().getName();
myStartup.load();
} catch (IllegalAccessException e) {
m_logger.error("Faild to load data into preload system. "+e);
} catch (InstantiationException e) {
m_logger.error("Faild to load data into preload system. "+e);
} catch (ClassNotFoundException e) {
m_logger.error("Faild to load data into preload system - Class "+ applicationName + "Not found. "+e);
}
}
}
BaseStartup インターフェイスは次のとおりです。
public interface BaseStartUp {
public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException;
}
修飾子と実装:
@Retention(RetentionPolicy.RUNTIME)
@Target ({ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
@Qualifier
@Dependent
public @interface MyStartup {
}
@MyStartup
public class MyStartUpLoader implements BaseStartUp {
@Inject
SomeConfigLoader config;
@Override
public void load() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
conifg.init();
}
}