不能将非可序列化类型的bean注入钝化范围的bean中

时间:2015-06-30 12:33:30

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

我正在学习Java EE 7.

我正在尝试将用户会话存储在@SessionScoped Backing Bean中,但我的IDE告诉我发生了错误,因为“无法将非可序列化类型的bean注入钝化作用域的bean”。 / p>

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

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

IDE:Intellij IDEA 14.1.4

1 个答案:

答案 0 :(得分:11)

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

您有4个选项:

  1. 忽略它。它运行得非常好。

  2. 犹豫不决,让EJB类实现Serializable

  3. 使用@javax.ejb.EJB代替@javax.inject.Inject来注入它。它还会注入EJB,但普通的IDE必须足够聪明,不要以这种方式抱怨序​​列化,因为IDE现在确实知道它实际上是EJB,而不是CDI托管bean。 / p>

  4. 将IDE升级到更新版本(如果有)。自Java EE 7以来,在EJB上使用@Inject而不是@EJB的能力是新的(尽管支持不太完整;例如@Asynchronous中的引用自我在使用时无法工作{ {1}})。如果仍然没有在最新的IDE版本中修复,即使它声称与Java EE 7兼容,也向他们报告错误。