我正在尝试使用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}" />
它正在运作,但我正在寻找最佳实践。
答案 0 :(得分:0)
请求作用域支持Bean旨在保持应用程序内存占用尽可能少,因此使用它们来支持带有@Model
批注的视图是很有意义的,缺点是必须获取持久性数据存储在处理数据的每个请求上,因此@Model bean的最佳用例是:
基本上每件事。 像这样的东西:
在请求范围内的bean中,这些事情很容易做到最好,但是其他bean的作用是什么?
我们可以简单地假设:
@ViewScoped
支持数据繁重的页面,在该页面中,用户通过许多交互来编辑数据,每个交互都是一个请求,但是访问每个数据库都是昂贵的。
@SessionScoped
来获取用户的会话数据,身份验证,凭据和配置。
@ApplicationScoped
CDI的全状态单例。
....每个其他范围都有它的用途,但是对于一个好的Web应用程序,@Model
应该是默认的,其他的都有特定的用例。
答案 1 :(得分:-2)
您还应该能够添加@Named
注释,并将其显示为editProduct
。
https://memorynotfound.com/cdi-managed-bean-example-with-named/
编辑:见评论