【问题标题】:Should EJBs be instance variables and marked as transient in JSF Managed Beans?EJB 是否应该是实例变量并在 JSF Managed Beans 中标记为瞬态?
【发布时间】:2012-04-07 01:47:18
【问题描述】:

我们有几个具有请求、视图和会话范围的 JSF 托管 bean,并且正在运行 WebLogic 11g (10.3.2)。 Weblogic 不支持 JSF 托管 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 接口实例变量标记为瞬态?

【问题讨论】:

    标签: jsf ejb weblogic


    【解决方案1】:

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

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

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


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

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

    【讨论】:

    • 我最终在我的 EJB 上得到了 NotSerializableException,它是我的 ViewScoped Managed Bean 上的一个实例变量。注意我没有在我的 ManagedBean 中使用 @EJB,而是在 ServletContextListener 中使用 @EJB,然后从 ServletContext 中获取 EJB(我使用的 WebLogic 10.3 不支持托管 Bean 上的 @EJB)。将 EJB 标记为瞬态解决了这个问题。
    • 将其标记为瞬态会使您在服务器序列化会话时丢失它。这绝对不是“最佳实践”。无论如何,Weblogic 都是一种痛苦。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2015-01-20
    • 2018-12-25
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多