【问题标题】:Why can't I have a session bean as a JSF backing bean in Java EE 5为什么我不能在 Java EE 5 中将会话 bean 作为 JSF 支持 bean
【发布时间】:2011-01-26 18:33:16
【问题描述】:

AFAIK,JBoss Seam 的全部目的是集成 EJB 和 JSF。

Seam in Action 一书说:

根据设计,EJB 组件不能直接绑定到 JSF 视图。 EJB 很棒 组件是可扩展的、事务性的、线程安全的和安全的,但它并没有做太多的事情 如果它们与 Web 层完全隔离,只能通过 JSF 访问,那就太好了 backing bean 充当中介。

但是我找不到这种不可能的原因/动机,为什么它们与网络层隔离?为什么我不能使用 EJB 作为支持 bean?愿意开导我吗?

【问题讨论】:

标签: jsf seam ejb


【解决方案1】:

但我找不到这种不可能的原因/动机,为什么它们与网络层隔离?

传统上,这样做是为了强制分离业务逻辑和视图相关代码。将这些混合在一起是每个初学者都会做的事情,而且从长远来看,它总是会导致系统难以维护。

通过允许 EJB 直接用作支持 bean,人们会将 FacesMessages 和特定页面的格式化程序以及渲染代码等放入其中。

严格的隔离可以防止这些错误的发生。然而,这也提高了同样的初学者开始使用 EJB 的门槛,并给 EJB 带来了一些困难的名声(尽管对于 EJB3,情况并非如此)。在最新的 Java EE 6 版本中,通过允许在 Web 模块中定义没有接口的 EJB,许多混合成为可能。通过 CDI 注释,它们可以直接用作支持 bean。

根据您的观点,这是向前迈出的一步(更容易,更少的约束,更少需要的工件),但它也可以被视为倒退(再次促进视图和业务逻辑的混合,这在 JSP 上弃用了 scriptlet试图阻止)。

【讨论】:

  • 但是有什么东西真的阻止我使用 @Entity 作为支持 bean 还是只是一种不好的做法?我记得读过一些关于无法同时访问网络状态(请求、会话)和事务状态的内容
  • 一个@Entity 作为后备bean???那会有点尴尬:P但是如果这就是“支持bean”的意思,那么您可以很好地绑定到实体。每个视图(页面)通常都有一个从服务获取数据的支持 bean。结果可以是实体的集合或单个实体。支持 bean 返回 this 并且视图可以绑定到它。例如。 h:input value="#{myBacking.person}" 其中 person 是 @Entity。
  • 为什么会尴尬?这就是接缝所鼓励的
  • 我真的不会说 seam(现在是 CDI)鼓励它。可以将实体与范围相关联,但这更多是为了进行数据绑定,而不是真正作为包含例如的支持 bean。保存/更新等方法。也许混淆是托管 bean(EL 在页面上使用的任何“帮助”bean)和真正的支持 bean(一种“控制”单个页面的整个功能的托管 bean)。
【解决方案2】:

Seam 的目的不是为了做到这一点。然而,CDI(焊接)是。使用 CDI,您可以 @Inject JSF bean 中的 EJB。 (正如 arjan 所说 - 您也可以在没有 CDI 的情况下执行此操作,并且由于 CDI 是 JavaEE6,因此您可以尝试使用 @EJB private RemoteInterface bean

但这与 JPA 实体无关。尽管 JPA 被认为是 EJB 的一部分,并且它的前身是“实体 bean”,一种特殊类型的 EJB,但最好不要将 EJB 和 JPA 视为一个想法。 JPA 是一种 ORM 标准。 EJB 是一种服务/组件模型。

@Entity 对象由EntityManager 管理。它们不是由 ejb 容器管理,也不是由 seam 管理,甚至不是由 CDI 管理。这是因为它们不适合这三个采用的组件模型。实体通常由开发人员实例化。对于 CDI/EJB/Seam,它是实例化组件、管理它们并执行注入的框架。

【讨论】:

  • >使用 CDI,您可以在 JSF bean 中注入 EJB - 在没有 CDI 的 Java EE 5 或 6 中也可以在 JSF 托管 Bean 中注入 EJB ;)
  • @arjan 是的 - 我是否正确地记得它是由 @Resource(name="jndiName") 完成的?如果是这样,让我澄清一下我的答案,即 cdi 按类型提供注入,而无需指定 jndi 名称。
  • 比这更简单,只需@EJB SomeBeanInterface someBean
  • @arjan - 啊哈。感谢您的澄清。一年多没用EJB了:)
  • Seam is not aimed to do that你能澄清一下吗?
猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2012-06-27
  • 2018-08-15
相关资源
最近更新 更多