EJB应该是实例变量并在JSF托管bean中标记为瞬态吗?

EJB应该是实例变量并在JSF托管bean中标记为瞬态吗?,jsf,ejb,weblogic,Jsf,Ejb,Weblogic,我们有几个JSF托管bean,它们具有请求、视图和会话范围,并且正在运行WebLogic11g(10.3.2)。Weblogic不支持JSF托管Bean中的@EJB注释,因此我们使用这些过程创建了一个ServletConextListener,以使用@EJB注释加载EJB引用 实际上,在JSF托管Bean中,我们可以通过从ServletContext获取EJB接口来查找希望使用的EJB 因此,问题是: 1) 让EJB接口成为ManagedBean上的实例变量可以吗?(其基本原理是在一个页面周期内

我们有几个JSF托管bean,它们具有请求、视图和会话范围,并且正在运行WebLogic11g(10.3.2)。Weblogic不支持JSF托管Bean中的@EJB注释,因此我们使用这些过程创建了一个ServletConextListener,以使用@EJB注释加载EJB引用

实际上,在JSF托管Bean中,我们可以通过从ServletContext获取EJB接口来查找希望使用的EJB

因此,问题是:

1) 让EJB接口成为ManagedBean上的实例变量可以吗?(其基本原理是在一个页面周期内多次调用EJB)

2) 如果我们确实让它们成为实例变量,我们是否应该将EJB接口实例变量标记为瞬态变量

1) 让EJB接口成为ManagedBean上的实例变量可以吗?(其基本原理是在一个页面周期内多次调用EJB)

这是正常的设计,是的。它与使用
@EJB
时没有什么不同。返回的EJB实例无论如何都是一个实例。代理将转而担心将方法调用委托给容器的EJB池中适当且可用的具体EJB实例

您唯一关心的可能是相对于JSF托管bean作用域而言的
@Stateless
@Stateful
。您需要真正理解每个EJB会话代表什么。
@Stateless
可能会在每次调用时返回一个随机实例。
@Stateful
只要客户机(在本例中是JSF管理的bean实例)存在,就提供相同的实例。可以在此处找到更深入的解释:


2) 如果我们确实让它们成为实例变量,我们是否应该将EJB接口实例变量标记为瞬态变量


不需要。默认情况下,EJB代理已经可序列化。

我在EJB上得到了一个NotSerializableException,它是ViewScope托管Bean上的一个实例变量。注意,我不是在ManagedBean中使用@EJB,而是在ServletContextListener中使用@EJB,然后从ServletContext中获取EJB(我使用的WebLogic 10.3在托管Bean上不支持@EJB)。将EJB标记为transient解决了这个问题。将其标记为transient将使您在服务器序列化会话时丢失它。这绝对不是“最佳做法”。无论如何,Weblogic是一种痛苦。