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

Pep*_*dez 6 jsf ejb intellij-idea java-ee cdi

我正在学习Java EE 7.

我正在尝试将用户会话存储在@SessionScopedBacking 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


}
Run Code Online (Sandbox Code Playgroud)

@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;
...
Run Code Online (Sandbox Code Playgroud)

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

IDE:Intellij IDEA 14.1.4

Bal*_*usC 12

这是一个错误的错误.有问题的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 上使用的能力是新的(尽管支持不太完整;例如,引用self in @Asynchronous在使用时将不起作用@Inject).如果仍然没有在最新的IDE版本中修复,即使它声称与Java EE 7兼容,也向他们报告错误.

  • `@ EJB`不能完全相同:你将失去使用CDI拦截器/装饰器的能力(对于有状态bean,这个问题不是这种情况,你将失去使用CDI范围的能力).也许这对于这种情况无关紧要,但只是提及将来找到这个答案的任何人. (5认同)