我们有几个带有请求,视图和会话范围的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接口实例变量标记为瞬态?
答案 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代理已经可序列化。