不能将非可序列化类型的Bean注入到过渡性作用域的Bean中。

11

我正在学习Java EE 7。

我试图将用户会话存储在一个@SessionScoped的Backing Bean中,但是我的IDE告诉我有一个错误,因为"不能将非可序列化类型的bean注入到被动作用域的bean中"。

@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


}

@无状态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


3
有人在IDEA中报告了这个问题:https://youtrack.jetbrains.com/issue/IDEA-224468。如果有人遇到了这个问题,请投票支持一下。 目前,你也可以在IDEA中禁用此检查作为解决方法(可能并不是一个好主意)。 - floating cat
1个回答

17

这是一个错误的警告。涉及到的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之后使用@Inject而不是@EJB来管理EJB(尽管支持不够完全;例如,在使用@Inject时无法引用自身中的@Asynchronous)。如果即使在最新的IDE版本中仍未解决该问题,即使它声称符合Java EE 7标准,也要向他们报告错误。


7
@EJB 的工作方式并不完全相同:使用它将失去使用CDI拦截器/装饰器的能力(对于有状态bean而言,这并非本问题的情况,但你也会失去使用CDI作用域的能力)。也许在这种情况下这并不重要,但是对于未来查看此答案的任何人来说,只是提一下。 - Brett Kail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接