我有一个单身豆。目前我开始使用@startup注释。我想改变这种行为,我想在运行时在需要对象时初始化它。
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class MyFacade extends AbstractBusinessFacade {
/** Static instance */
private static MyFacade instance = null;
/** MyParameter Facade. */
@EJB
private MyParameterFacade myParameterFacade;
@SuppressWarnings("unused")
@PostConstruct
private void init() {
checkPreconditions(); // At deploy Time it fails. because the dependent objects are not ready
instance = this;
}
public static MyFacade getInstance() {
return instance;
}
@Lock(LockType.WRITE)
public void checkTimeout() {
if (timeOutReached()) {
//do something;
}
} .. }
我在侦听器中使用此对象。
public class MySynchronizationEntityListener {
private MyFacade myFacade = MyFacade.getInstance();
@SuppressWarnings("unused")
@PreUpdate
@PrePersist
@PreRemove
private void checkStatus(final Object entity) {
myFacade.checkTimeout();
}
}
}
我使用entites的听众
@Entity
@EntityListeners(MySynchronizationEntityListener.class)
public class MyEntity{
}
如果删除@startup注释。我得到空指针异常。如何确保在需要时在运行时启动Singletonbean。
答案 0 :(得分:0)
您应该查找或注入Singleton,而不是使用您的实例变量。您的容器不知道何时需要该对象,因此它永远不会实例化它。
鉴于您的侦听器不支持注入,您可以实现此处发布的EJB查找工具(http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#GettingAnEJBInFacesConverterAndFacesValidator),以便您可以查找该bean。
private MyFacade myFacade = EJB.lookup(MyFacade.class);
然后,当您的侦听器被实例化并查找您的MyFacade
bean时,容器将实例化您的Singleton。