EJB应该是实例变量并在JSF Managed Beans中标记为瞬态吗?

时间:2012-03-22 13:31:30

标签: jsf ejb weblogic

我们有几个带有请求,视图和会话范围的JSF托管bean,并且正在运行WebLogic 11g(10.3.2)。 Weblogic不支持JSF Managed Bean中的@EJB注释,因此我们使用这些过程http://technology.amis.nl/2008/12/06/ejb-dependency-injection-of-session-bean-facade-in-jsf-12-on-weblogic-103-jsf-with-jpa/创建了一个ServletConextListener来使用@EJB注释加载EJB引用。

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

所以问题是:

1)将EJB接口作为ManagedBean上的实例变量是否可以? (理由是在页面循环期间多次调用EJB)

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

1 个答案:

答案 0 :(得分:6)

  

1)将EJB接口作为ManagedBean上的实例变量是否可以? (理由是在页面循环期间多次调用EJB)

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

相对于JSF托管bean范围,您唯一关心的问题可能是@Stateless@Stateful。您需要真正了解每个EJB会话的含义。 @Stateless可能会在每次通话时返回一个随机实例。只要客户端(在这种特殊情况下,JSF托管bean实例)存在,@Stateful就会为您提供相同的实例。可以在此处找到更深入的解释:JSF request scoped bean keeps recreating new Stateful session beans on every request?


  

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

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