如何在侦听器类中使用单例bean

时间:2014-08-01 13:23:27

标签: java java-ee dependency-injection singleton ejb-3.1

我有一个单身豆。目前我开始使用@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。

1 个答案:

答案 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。