尝试在托管 bean 构造函数中访问 @EJB bean 时出现 NullPointerException

2023-11-30

我有一个 EJB 服务。

@Stateless
public class SomeService {}

我想将其注入到 viewscoped bean 中并用它进行初始化:

@ManagedBean
@ViewScoped
public class ViewBean implements Serializable {

    @EJB
    private SomeService someService;

    public ViewBean() {
        System.out.println(someService.getEntity());
    }

}

但是,它会引发以下异常:

com.sun.faces.mgbean.ManagedBeanCreationException: Cant instantiate class: com.example.ViewBean.
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:193)
    at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102)
    at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
    at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
    at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
    at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    [snip]
Caused by: java.lang.NullPointerException
    at com.example.ViewBean.<init>(ViewBean.java:42)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at java.lang.Class.newInstance0(Class.java:374)
    at java.lang.Class.newInstance(Class.java:327)
    at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188)
    ... 62 more

这是如何引起的以及如何解决?


换句话说,您期望 EJB 注入在幕后工作,如下所示:

ViewBean viewBean;
viewBean.someService = new SomeService(); // EJB injected, so that constructor can access it.
viewBean = new ViewBean(); // ViewBean constructed.

然而,这在技术上是不可能的。当实例根本没有被构造时,不可能分配实例变量。

在构造后直接执行基于注入依赖项的任务的规范方法是使用@PostConstruct带注释的方法。

因此,要解决您的具体问题,只需更换

public ViewBean() {

by

@PostConstruct
public void init() { // Note: Method name is fully free to your choice.

这样,该过程将大致如下:

ViewBean viewBean;
viewBean = new ViewBean(); // ShiftBean constructed.
viewBean.someService = new SomeService(); // EJB injected.
viewBean.init(); // PostConstruct invoked.

请注意,具体问题与视图范围完全无关。当使用请求、会话或应用程序范围的 bean 时,您会遇到完全相同的问题。因此,这是另一个证据,表明您从未通过使用不同的范围进行测试来真正排除它的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在托管 bean 构造函数中访问 @EJB bean 时出现 NullPointerException 的相关文章

随机推荐

  • yii 中 utf8 字符和 htmlspecialchars 错误

    我在 yii 中的字符编码有问题 如果我创建一个新的网络应用程序 Yii framework framework yiic webapp MyTest 然后转到 protected views layouts main php 并将页脚更改
  • Linux下C语言清除串口数据?

    我正在测试发送和接收程序 代码如下 main 函数如下 include lib h int fd int initport int fd struct termios options Get the current options for
  • C++ 变暖 std 向量

    为什么第二次填充 std vector 更快 即使从一开始就预留了空间 int total 1000000 struct BaseClass float m 16 int id BaseClass int id id id int main
  • Laravel 5.7 电子邮件验证路由

    Laravel 5 7 添加了电子邮件验证功能 但在我的项目中 我不使用默认的路由名称 而是出于自己的目的添加了前缀 现在 当我添加以下代码来添加验证路由时 它显示错误 Auth routes verify gt true 错误消息表明ve
  • Python下载文件

    我不确定该怎么做 一种方法是 import urllib request urllib request urlretrieve www example com file tar file tar 另一种方法是 import urllib r
  • 调用原生 Javascript 类型的方法,无需使用 () 包装

    在 Javascript 中 我们可以直接调用字符串文字上的方法 而无需将其括在圆括号内 但不适用于其他类型 例如数字或函 数 这是一个语法错误 但是 Javascript 词法分析器需要将这些其他类型括在圆括号中是否有原因 例如 如果我们
  • 这个承诺看起来正确吗?

    这似乎应该将数据传递到我的范围 但事实并非如此 下面的代码是否有任何直接跳出的错误 angular module Lunch services factory LunchMates q http gt LunchMates getLunch
  • 如何在 PHP 中使用 scandir 只获取图像?

    有没有办法只获取带有扩展名的图像jpeg png gif使用时等 dir tmp files1 scandir dir 您可以使用glob images glob tmp jpeg gif png GLOB BRACE 如果您需要不区分大小
  • 将 array_multisort() 与自定义函数一起使用[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我有以下数组 我想根据另一个数组对其进行排序 而不是DESC or ASC array array note gt array test test1 test2 test3 test4
  • 在具有 Html 服务的站点中显示电子表格数据 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我显示 我想做的事情与此类似tutorial但我不想使用 UI 服务来显示表格 而是想使用 HTML 服务 有人从这个question提到您可以使用
  • 不使用 try except 填充字典

    假设我有字典 并且我想用一些键和值填充它 第一个字典是空的 假设我需要这个字典作为计数器 例如计算字符串中的一些键 我有这样的方法 myDic try myDic desiredKey 1 except KeyError myDic des
  • 如何让 Apache POI 和 JAXB 协同工作?

    java lang ClassNotFoundException org apache xmlbeans XmlObject 当我运行我的代码时出现该错误 好吧 没关系 我只是忘记获取 XMLBeans 但它已经退役 我在他们的档案中找不到
  • 在javascript中调用并应用[重复]

    这个问题在这里已经有答案了 可能的重复 链调用和apply在一起是什么意思 我发现了一些这样的代码 function fun return Function prototype call apply Array prototype slic
  • 选择具有所有缺失值的字符变量

    我有一个包含大约 3 000 个变量的 SAS 数据集 我想删除所有值都缺失的字符变量 我知道如何对数字变量执行此操作 我特别想知道字符变量 我需要使用基本 SAS 来完成这项工作 但这可能包括 proc SQL 这就是为什么我也将这个标记
  • perl 从日期中减去一个月

    我得到格式为 dd mm YYYY 的日期 并尝试使用 Perl 减去一个月 示例 12 07 2013 gt 12 06 2013 30 09 2013 gt 31 08 2013 我应该使用 Date Calc 吗 有任何想法吗 Tha
  • C#中如何获取CPU使用率?

    我想获取 C 中应用程序的总体 CPU 使用率 我找到了很多方法来深入了解进程的属性 但我只想要进程的 CPU 使用率 以及您在 TaskManager 中获得的总 CPU 量 我怎么做 您可以使用性能计数器班级来自系统诊断 像这样初始化
  • Haskell 中的大规模设计? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 设计 构造大型函数式程序 尤其是在 Haskell 中 的好方法是什
  • 获取字符串列表的哈希值,无论顺序如何

    我想写一个函数GetHashCodeOfList 它返回字符串列表的哈希码 无论顺序如何 给定 2 个具有相同字符串的列表应该返回相同的哈希码 ArrayList list1 new ArrayList list1 Add String1
  • 将多个 XML 转换为 JSON 列表

    我想使用 PowerShell 脚本将具有相同 XML 属性格式的多个 XML 文件转换为 JSON 文件 这个想法是创建一个 JSON 列表 其中每个项目都是 XML 文件的 JSON 表示形式 可行吗 输入和输出的示例 Input Fi
  • 尝试在托管 bean 构造函数中访问 @EJB bean 时出现 NullPointerException

    我有一个 EJB 服务 Stateless public class SomeService 我想将其注入到 viewscoped bean 中并用它进行初始化 ManagedBean ViewScoped public class Vie