gpt4 book ai didi

jsf-2 - 使用什么,托管 bean(支持 bean)或实体 bean?

转载 作者:行者123 更新时间:2023-12-03 22:28:59 30 4
gpt4 key购买 nike

我看到很多示例将 bean 标记为实体 bean (@Entity) 和命名 bean (CDI),以避免创建 2 个类(托管 bean 和实体 bean)并利用 Bean 验证以便可以执行验证在客户端和服务器上。

那么我是否应该使用单个类,是否有任何问题,或者我应该让我的托管 bean 或服务层使用来自托管 bean 的数据创建实体 bean?

最佳答案

@Named 或 @ManagedBean 注释通常用于让 bean 容器 (CDI/JSF) 在被 JSF 中的表达式语言引用时按需创建 bean 的实例。

对于@Entity bean,仅仅获得一个任意的新实例通常没有多大意义。 @Entity 与持久身份有很强的联系。因此,从 Entity Manager 请求这样的实体。而不是来自 bean 容器。

典型的模式是有一个(纤细的)支持 bean,它被命名为调用服务(在 Java EE 中通常是 @Stateless)。然后服务返回实体。

在一些非常琐碎的系统中,人们有时会命名服务,从而直接提供给 EL。但是,最终您通常希望让“后台代码”生成人脸消息或处理(表)选择,这些都是纯业务服务不应该关心的事情。

另一个常见的快捷方式是让支持 bean 直接包含业务代码(例如,检索实体的实体管理器)。这使得业务代码难以重用,但如果应用程序是微不足道的并且不需要重用,您可能会侥幸逃脱。

但是让实体成为支持 bean 的情况很少见,而且与常见的 Java EE 模式背道而驰。

请注意,支持 bean 可以直接返回实体,因此仍然可以使用 bean 验证。很久以前出现的奇怪的“分散/聚集”模式完全不需要(参见 this question 中的第二个例子)。

例如。

@ViewScoped
@ManagedBean
public class BackingBean {

private SomeEntity myEntity; // + getter

@EJB
private Service service;

@PostConstruct
public void init() {
myEntity = service.getSomeEntity();
}

public void save() {
service.save(myEntity);
FacesContext.getCurrentInstance().addMessage(..., ...);
}
}

假设 SomeEntity在带有@Entity 注释的 bean 中,现在可以在 Facelet 上使用 bean 验证,例如:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
>
<h:body>
<h:form>
<h:inputText value="#{backingBean.myEntity.name}" />
<h:commandButton value="Save" action="#{backingBean.save}" />
</h:form>
</h:body>
</html>

如果 SomeEntity.name 有约束它将被验证。

关于jsf-2 - 使用什么,托管 bean(支持 bean)或实体 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8463178/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com