我正在学习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
答案 0 :(得分:11)
这是一个错误的错误。有问题的IDE显然不够智能,无法检测到它实际上是一个EJB,而不是一个简单的" CDI(或JSF)托管bean。 EJB总是可以隐式序列化的。
您有4个选项:
忽略它。它运行得非常好。
犹豫不决,让EJB类实现Serializable
。
使用@javax.ejb.EJB
代替@javax.inject.Inject
来注入它。它还会注入EJB,但普通的IDE必须足够聪明,不要以这种方式抱怨序列化,因为IDE现在确实知道它实际上是EJB,而不是CDI托管bean。 / p>
将IDE升级到更新版本(如果有)。自Java EE 7以来,在EJB上使用@Inject
而不是@EJB
的能力是新的(尽管支持不太完整;例如@Asynchronous
中的引用自我在使用时无法工作{ {1}})。如果仍然没有在最新的IDE版本中修复,即使它声称与Java EE 7兼容,也向他们报告错误。