【问题标题】:@Inject gives null Object [duplicate]@Inject 给出空对象 [重复]
【发布时间】:2018-06-28 19:06:40
【问题描述】:

我有这两个类,想用MyData的方法在MyBean中插入数据。

@Named
@RequestScoped
public class MyBean implements Serializable {

    @Inject
    private MyData myData;

    public MyBean() {
        // NullPointerException, because myData is null
        this.dataList = myData.method();
    }
...
}

@Singleton
class MyData {
    method(){
        ...
    }
}

另一方面,MyData 注入了一个控制器类 myHandler:

@Singleton
public class myHandler {...}

我不断收到错误消息,myData.method() 为空并且对此一无所知。可能我还没有完全理解CDI注入是什么意思?

编辑: 这些是完全限定的注释。

import javax.ejb.Singleton;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

Edit2:使用的容器是 wildfly 11。由于我也使用 Maven,因此我的项目结构没有什么可以做的,因为我必须遵循 Maven 规则。 正如我之前提到的,服务器在我之前使用 CDI 和 JSF 的数据库上的 crud 操作上工作得很好。我刚刚将 MyBean 和 MyData 添加到我的项目中。 我试过@Startup,结果没有改变。

Edit3:我不认为这是重复的,因为我尝试使用 @DependsOn() 注释并且仍然返回 null。 NullException 不是来自 bean,而是来自 JavaScript,我想在其中插入一个带有 JSF 的字符串,稍后将其处理为图表。 stacktrace 说,这个函数将 null 值传递给 bean 构造函数中的成员变量。

【问题讨论】:

  • 你在某处配置了那个 bean 吗?
  • 我的 IDE 创建了 beans.xml。
  • 还有,你在那里配置了你的 bean 吗?
  • 我已将 bean-discovery-mode 设置为 all,所以这应该足够了。我项目中使用注入的其他 bean 也可以正常工作。
  • 在找到问题之前有很多问题需要回答: 1. 你在什么(什么样的)容器中运行它? 2. 您正在使用的注释的完全限定名称是什么? 3. 当您只使用普通的 JSF 托管 bean 时,这是否有效?

标签: jsf cdi


【解决方案1】:

你是否误用了 EJB Singleton? javax.ejb.Singleton 不被 CDI 识别,因此不会被拾取。

对于 CDI,使用 javax.inject.Singleton 或 @ApplicationScoped。

【讨论】:

  • 它也不适用于更改的注释。
  • 另外,CDI 确实将 EJB Singleton 识别为 bean,并且它非常常一起使用。事实上,CDI 的 Singleton 的行为可能与您的预期不同(如果感兴趣,请参阅文档)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2023-03-10
  • 1970-01-01
  • 2015-11-13
  • 2016-09-10
  • 2015-06-22
  • 2019-11-10
相关资源
最近更新 更多