我正在尝试实现一个管理数据库属性的单例类。但是,当我尝试注入我的数据库bean时,我得到一个nullPointerException。这是我的代码:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
..
@Stateless
public class Properties {
public static volatile Properties instance;
private static Map<String, String> properties = new HashMap<String, String>();
@EJB(WHAT_TO_DO_HERE)
private DatabasePersisterLocal databasePersister;
public static Properties getInstance() {
if (instance == null) {
synchronized (Properties.class) {
if (instance == null) {
instance = new Properties();
}
}
}
return instance;
}
private Properties() {
System.out.println("starting");
System.out.println(databasePersister); //null
//initializing
}
}
我将我的项目导出为jar,稍后,当我尝试获取Properties
的实例时,我会打印starting
,然后打印nullPointerException
。当我尝试从我的其他项目中注入相同的EJB(DatabasePersisterLocal)时,我没有收到任何错误。我做错了什么?
答案 0 :(得分:0)
无论您面临的bean注入问题如何,我想澄清一下,使用EJB实现Singleton是不可行的,至少就像您尝试这样做一样。
原因是ejb实例由容器处理。 EJB的线程模型指定每个请求都将由可用的EJB实例管理,该实例先前已实例化并分配给ejb列表(池)。
但是,如果您使用的是EJB 3.1,则可以使用注释@Singleton来指示必须只创建一个EJB实例的容器。