使用@Model`javax.enterprise.inject.Model`作为JSF支持bean?

时间:2018-03-07 01:48:26

标签: cdi jsf-2.2 java-ee-7

我正在尝试使用CDI bean实现JSF支持bean,如@ManagedBean的折旧及其范围注释所示,但我正在努力使用正确的用例,我正在尝试用@实现视图支持bean模型(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}" />

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

2 个答案:

答案 0 :(得分:0)

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

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

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

在请求范围内的bean中,这些事情很容易做到最好,但是其他bean的作用是什么?

我们可以简单地假设:

  1. @ViewScoped支持数据繁重的页面,在该页面中,用户通过许多交互来编辑数据,每个交互都是一个请求,但是访问每个数据库都是昂贵的。

  2. @SessionScoped来获取用户的会话数据,身份验证,凭据和配置。

  3. @ApplicationScoped CDI的全状态单例。

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

答案 1 :(得分:-2)

您还应该能够添加@Named注释,并将其显示为editProduct

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

编辑:见评论