无法将不可序列化类型的 bean 注入钝化范围的 bean

Cannot inject bean of non-serializable type into bean of passivating scope

我正在学习 Java EE 7。

我正在尝试将用户会话存储在 @SessionScoped Backing Bean 中,但我的 IDE 告诉我出现错误,因为 "Cannot inject bean of non-serializable type into bean of passivating scope".

@SessionScoped bean:

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;
...

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

IDE: Intellij IDEA 14.1.4

这是一个误报。有问题的 IDE 显然不够聪明,无法检测到它实际上是一个 EJB,而不是 "simple" CDI(或 JSF)管理的 bean。 EJB 始终是隐式可序列化的。

您有 4 个选项:

  1. 忽略它。它会 运行 完全没问题。

  2. 为假错误鞠躬,让 EJB class 实现 Serializable 无论如何。

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

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