将 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 实例?

Managed Bean中的EJB3.0 @EJB注释JSF2 Websphere 7是不可能的?

托管 bean 问题中的用户输入验证(JSF 2.0)