我需要使用依赖注入从某些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对象。

08-16 08:04
查看更多