gpt4 book ai didi

java - Singleton CDI @Inject 空指针异常

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:59 24 4
gpt4 key购买 nike

我需要使用依赖注入(inject)从某些 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())触发事件或由调度程序调用 startDay() 方法时(@Schedule(hour = "", 分钟 = "", Second = "/10")* 时,不会出现 NPE。不知道是什么原因

最佳答案

请注意,@Singleton 意味着容器(EJB 或 CDI,取决于它是哪个注释)将管理实例,即不应该自己创建它。

如果您通过 private static final MainDay mDay = new MainDay(); 创建实例,容器不会进行任何注入(inject),因此 webEvent 将为 null。除此之外,容器不会知道该实例,并且在其他地方使用 @Inject MainDay 很可能会生成另一个实例。

因此只需直接使用注入(inject)(或查找,如果需要):

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();
...
}

There is no NPE when I fire event from a call of static method like MainDay.initDS() or when method startDay() is invoked by a Sheduler (@Schedule(hour = "", minute = "", second = "/10")*. I have no idea what is the reason

在不知道您的代码的情况下,这只是一个猜测,但我假设您在此处注入(inject) MainDay 或使用 CDI/JNDI 查找。因此,如果没有实例,容器将创建一个实例,并将注入(inject) Event 对象。

关于java - Singleton CDI @Inject 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43180145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com