我需要使用依赖注入从某些ejb(无状态和单例)中触发事件。我不使用Spring,Guice等。
问题是,通过getInstance()调用其方法时,我在一个bean中得到了NPE。这是代码片段:
@Stateless
@LocalBean
public class ControllerStartStop {
@Inject
private Event<SomeWebMessage> webEvent;
public String startCircle(String passwordP, String passwordH) {
.........
String res = "some msg";
webEvent.fire(new SomeWebMessage(res, 0)); // this works fine
MainDay.getInstance().startDay(); // NullPointerException
这是MainDay单身人士:
@Singleton
public class MainDay {
private static final MainDay mDay = new MainDay();
public static MainDay getInstance() { return mDay ; }
@Inject
private Event<SomeWebMessage> webEvent;
public void startDay() {
String s = new String("MainDay");
webEvent.fire(new SomeWebMessage(s,0)); // NullPointerException
beans.xml位于META-INF中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
</beans>
当我从诸如MainDay.initDS()的静态方法调用触发事件或由Sheduler调用方法startDay()时,没有NPE(@Schedule(hour =“”,minutes =“”,second =“ / 10 “)*。
我不知道是什么原因
最佳答案
请注意,@Singleton
意味着容器(EJB或CDI,取决于它是哪个注释)将管理实例,即,您不应该自己创建它。
如果通过private static final MainDay mDay = new MainDay();
创建实例,则容器将不会进行任何注入,因此webEvent
将为null。除此之外,容器不会知道该实例,在其他地方使用@Inject MainDay
很有可能产生另一个实例。
因此,只需直接使用注入(或查找,如果需要):
class ControllerStartStop {
@Inject
private MainDay mDay;
...
public String startCircle(String passwordP, String passwordH) {
...
String res = "some msg";
webEvent.fire(new SomeWebMessage(res, 0));
mDay.startDay();
...
}
当我从诸如MainDay.initDS()的静态方法调用触发事件或由Sheduler调用方法startDay()时,没有NPE(@Schedule(hour =“”,minutes =“”,second =“ / 10 “)*。我不知道是什么原因
不知道您的代码只是一个猜测,但是我认为您是在这里注入
MainDay
或使用CDI / JNDI查找。因此,如果没有实例,容器将创建一个实例,并将注入Event
对象。