将 JSF2 托管 pojo bean 传递到 EJB 或将所需内容放入传输对象
Posted
技术标签:
【中文标题】将 JSF2 托管 pojo bean 传递到 EJB 或将所需内容放入传输对象【英文标题】:Passing a JSF2 managed pojo bean into EJB or putting what is required into a transfer object 【发布时间】:2012-03-04 00:08:47 【问题描述】:目前我正在从JSF 2
调用EJB 3
Session Beans。但是,我不确定是否应该将 JSF 托管 bean 传递给 EJB?
假设表单(以及支持 bean)上的任何内容都是我需要通过 EJB 层持久保存的所有内容,我应该手动将所有属性克隆到传输对象中,还是有更好的方法来做到这一点?
虽然POJO
的支持bean 使用JSF 生命周期标记(例如@ManagedBean
)进行了大量注释,并且驻留在Web project
中,而EJB 分别驻留在EJB project
中。
【问题讨论】:
【参考方案1】:听起来好像您已经将模型与控制器紧密耦合,就像大多数基本的 JSF 教程中所示。您应该将模型与控制器分离到它自己的类中。当您使用 EJB 时,您也使用 JPA 的机会很大(否则 EJB 对持久性真的有用吗?),您可以使用现有的 JPA @Entity
类作为模型。
例如
@Entity
public class Product
@Id
private Long id;
private String name;
private String description;
private Category category;
// ...
与
@ManagedBean
@ViewScoped
public class ProductController
private Product product;
@EJB
private ProductService service;
public void save()
service.save(product);
// ...
用作
<h:form>
<h:inputText value="#productController.product.name" />
<h:inputTextarea value="#productController.product.description" />
<h:selectOneMenu value="#productController.product.category">
<f:selectItems value="#applicationData.categories" />
</h:selectOneMenu>
<h:commandButton value="Save" action="#productController.save" />
</h:form>
【讨论】:
嗨 BalusC,谢谢,在阅读了您在其他线程中的一个回复后,我尝试了类似于此的实现。只是好奇,产品是否也需要注释为托管 bean,我认为在我之前的尝试中我遇到了一些异常,因为我没有将产品注释为托管 bean。 不,绝对不是。这个问题一定是由其他原因引起的。也许您尝试在其他地方使用#product
,而它在范围内根本不可用。
@BalusC 所以这意味着我们通常应该有三个类:1. 视图(产品),2. 服务,它将处理 DAO 和 3. 控制器,它将是由Xhtml。对于每个视图,我都应该有一个服务和一个控制器,对吧?
@Erick:服务与视图无关。它与模型相关联。换句话说,您可以在其他视图(和控制器)上重用模型和服务。
是的,抱歉。我的意思是说,对于每个模型,我都应该有一个服务和一个控制器【参考方案2】:
我试图对 CDI 做同样的事情,主要区别(不包括使用 @Named
而不是 @ManagedBean
)是我必须在 Controller 类中初始化我的传输对象。
所以而不是:
private Product product;
我不得不使用:
private Product product = new Product();
也许它会帮助某人:)
【讨论】:
以上是关于将 JSF2 托管 pojo bean 传递到 EJB 或将所需内容放入传输对象的主要内容,如果未能解决你的问题,请参考以下文章
在 JSF 和 JPA 项目中使用 POJO 作为模型,对吗?
托管 Bean 的 JSF 2.0 ArrayList 属性
JSF 2.x @ViewScoped 托管 bean 线程安全吗?
使用@EJB 时,每个托管bean 是不是都有自己的@EJB 实例?