【问题标题】:Cannot inject bean of non-serializable type into bean of passivating scope无法将不可序列化类型的 bean 注入到钝化范围的 bean 中
【发布时间】:2015-09-17 06:16:55
【问题描述】:

我正在学习 Java EE 7。

我正在尝试将用户会话存储在 @SessionScoped 支持 Bean 中,但我的 IDE 告诉我出现错误,因为“无法将不可序列化类型的 bean 注入到钝化范围的 bean 中”。

@SessionScoped 豆:

import negocio.Autenticacion;

import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.Serializable;

@Named
@SessionScoped
public class UserSesion implements Serializable{

    @Inject
    private Autenticacion auth; // Error by IDE


}

@Stateless EJB 代码:

import modelo.Usuario;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.security.MessageDigest;

@Stateless
public class AutenticacionBean implements Autenticacion{

    @PersistenceContext(unitName = "Banco-PU")
    private EntityManager em;
...

为什么我不能在后台 bean 中注入 EJB?

IDE:Intellij IDEA 14.1.4

【问题讨论】:

  • 有人在 IDEA 中报告了这个问题:youtrack.jetbrains.com/issue/IDEA-224468。如果有人遇到过这个问题,请为这个问题投票。目前,您还可以在 IDEA 中禁用此检查作为一种解决方法(可能不是一个好主意)。

标签: jsf jakarta-ee intellij-idea ejb cdi


【解决方案1】:

这是一个错误的错误。有问题的 IDE 显然不够聪明,无法检测到它实际上是一个 EJB,而不是一个“简单的”CDI(或 JSF)托管 bean。 EJB 总是隐式可序列化的。

您有 4 个选项:

  1. 忽略它。它会运行得很好。

  2. 为错误的错误鞠躬,让 EJB 类实现Serializable

  3. 使用@javax.ejb.EJB 而不是@javax.inject.Inject 注入它。它还会注入 EJB,但一般的 IDE 必须足够聪明,不会抱怨这种方式的序列化,因为 IDE 现在可以确定它实际上是 EJB,而不是 CDI 托管 bean。

  4. 将 IDE 升级到已修复此问题的较新版本(如果有)。自 Java EE 7 以来,在 EJB 上使用 @Inject 而不是 @EJB 的能力是新的(尽管支持不太完整;例如,在使用 @Inject 时在 @Asynchronous 中引用 self 将不起作用)。如果在最新的 IDE 版本中仍未修复,即使它声称与 Java EE 7 兼容,请向他们报告错误。

【讨论】:

  • @EJB 的工作方式并不完全相同:您将失去使用 CDI 拦截器/装饰器的能力(对于有状态的 bean,这不是这个问题的情况,您将失去能力使用 CDI 范围)。也许这对这种情况无关紧要,但只是为将来找到此答案的任何人提及。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2012-04-03
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多