将@Model`javax.enterprise.inject.Model`用于JSF支持bean?

using @Model `javax.enterprise.inject.Model` for JSF backing bean?

我正在尝试使用 CDI bean 实现 JSF 支持 bean,正如 @ManagedBean 的贬值和它的范围注释所建议的那样,但我正在努力使用正确的示例,我正在尝试实现视图支持 bean使用 @Model (javax.enterprise.inject.Model) 这是 @Named @RequestScoped.

我找到了这个 question 但它使用的是 ViewScope bean,我将如何使用 RequestScoped(最好是 @Model)实现相同的功能,@Model 的最佳实践通常是什么?

编辑 1: 我尝试在 EditProduct PostConstruct 中创建一个新产品:

@Model
public class EditProduct {

    private Product product; // +getter +setter

    @Inject
    private ProductService productService;

    @PostConstruct
    public void init(){
        product = new Product();        
    }
    public String save() {
        productService.save(product);
        return "/products?faces-redirect=true";
    }

    // ...
}

然后通过

设置产品
<f:viewParameter name="product-id" target="#{editProduct.product}"
converter="#{productConverter}" />

它正在运行,但我正在寻找最佳实践。

您应该还可以添加 @Named 注释,它将显示为 editProduct

https://memorynotfound.com/cdi-managed-bean-example-with-named/

编辑:见评论

请求作用域的支持 bean 旨在使应用程序内存占用尽可能低,因此使用它们来支持带有 @Model 注释的视图很有意义,缺点是必须达到每个处理数据的请求的持久性数据存储,因此 @Model bean 的最佳用例是:

基本上每一件事。 像这样的东西:

  1. JSF 页面的事件处理
  2. 延迟加载数据
  3. 验证和转换以及其他代码执行
  4. 等等....是的,其他的都

这些事情在请求范围的 bean 中很容易完成,但是其他 bean 的作用是什么?

简单来说,我们可以假设:

  1. @ViewScoped 以支持数据繁重的页面,其中用户通过多次交互编辑数据,每次交互都是一个请求,但每次访问数据库的成本都很高。

  2. @SessionScoped 用于用户的会话数据、身份验证、凭据和配置。

  3. @ApplicationScoped CDI 的 state-full 单例。

...每个其他范围都有其用途,但对于一个好的 Web 应用程序,@Model 应该是默认值,其他范围有特定的用例。