Jsf 2 将JSF2管理的pojo bean传递到EJB中,或将所需内容放入传输对象中

Jsf 2 将JSF2管理的pojo bean传递到EJB中,或将所需内容放入传输对象中,jsf-2,ejb-3.0,Jsf 2,Ejb 3.0,目前我正在从jsf2调用ejb3会话bean。然而,我不确定是否应该将JSF管理的bean传递到EJB中 假设表单上的任何内容(以及支持bean)都是我在EJB层中持久化所需的所有内容,那么我应该手动将所有属性克隆到一个传输对象中,还是有更好的方法 尽管POJO中有大量的JSF生命周期标记(例如@ManagedBean)对支持bean进行了注释并且驻留在Web项目中,而EJB分别驻留在EJB项目中,这听起来好像您已经将模型与控制器紧密耦合,如大多数基本JSF教程中所示。您应该将模型从控制器解耦到

目前我正在从
jsf2
调用
ejb3
会话bean。然而,我不确定是否应该将JSF管理的bean传递到EJB中

假设表单上的任何内容(以及支持bean)都是我在EJB层中持久化所需的所有内容,那么我应该手动将所有属性克隆到一个传输对象中,还是有更好的方法


尽管
POJO
中有大量的JSF生命周期标记(例如
@ManagedBean
)对支持bean进行了注释并且驻留在
Web项目中
,而EJB分别驻留在
EJB项目中

,这听起来好像您已经将模型与控制器紧密耦合,如大多数基本JSF教程中所示。您应该将模型从控制器解耦到它自己的类中。当您在使用EJB时,您也在使用JPA的可能性很大(否则EJB对持久性有什么用处呢?),您可以使用现有的JPA
@Entity
类作为模型

例如

它将被用作

<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>

听起来像是将模型与控制器紧密耦合在一起,如大多数基本JSF教程所示。您应该将模型从控制器解耦到它自己的类中。当您在使用EJB时,您也在使用JPA的可能性很大(否则EJB对持久性有什么用处呢?),您可以使用现有的JPA
@Entity
类作为模型

例如

它将被用作

<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>

我试图对CDI做同样的操作,主要区别(不包括使用
@Named
而不是
@ManagedBean
)是我必须在控制器类中初始化传输对象

因此,不是:

私人产品

我必须使用:

私有产品=新产品()


也许这会对某些人有所帮助:)

我正试图用CDI做同样的事情,主要区别(不包括使用
@Named
而不是
@ManagedBean
)是我必须在控制器类中初始化我的传输对象

因此,不是:

私人产品

我必须使用:

私有产品=新产品()


也许它会对某人有所帮助:)

你好,巴卢斯克,谢谢,在阅读了您在其他线程中的一条回复后,我尝试了类似的实现。只是好奇,难道产品不需要被注释为托管bean吗?我想在我之前的尝试中,我遇到了一些例外,因为我没有将产品注释为托管bean。不,绝对不是。那个问题一定是由别的原因引起的。可能您试图在其他地方使用
#{product}
,但它在作用域中根本不可用。@BalusC所以它意味着我们通常应该有三个类:1。视图(产品),2。服务,它将处理DAO和3。XHTML可以访问的控制器。对于每个视图,我都应该有一个服务和一个控制器,对吗?@Erick:服务不与视图绑定。它与模型相关联。换句话说,您可以在其他视图(和控制器)上重用模型和服务。我的意思是说,对于每种型号,我都应该有一个服务和一个控制器。谢谢,在阅读了您在其他线程中的一个回复后,我尝试了类似的实现。只是好奇,难道产品不需要被注释为托管bean吗?我想在我之前的尝试中,我遇到了一些例外,因为我没有将产品注释为托管bean。不,绝对不是。那个问题一定是由别的原因引起的。可能您试图在其他地方使用
#{product}
,但它在作用域中根本不可用。@BalusC所以它意味着我们通常应该有三个类:1。视图(产品),2。服务,它将处理DAO和3。XHTML可以访问的控制器。对于每个视图,我都应该有一个服务和一个控制器,对吗?@Erick:服务不与视图绑定。它与模型相关联。换句话说,您可以在其他视图(和控制器)上重用模型和服务。我的意思是说,对于每种型号,我都应该有一个服务和一个控制器
<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>