【发布时间】:2013-01-07 10:02:23
【问题描述】:
在 JSF 页面上,每个句柄文件上传事件都会创建一个新的 Bean 实例。好像每次都是新客户一样。此外,网络浏览器似乎也是一个不同的客户端。
那么,有没有办法让这些仅来自一个浏览器的 FileUploadEvents 只实例化一个 Bean?
我正在尝试使用 CDI 而不是 @ViewScoped JSF bean。
index.xhtml:
<p:fileUpload fileUploadListener="#{bean.handleFileUpload}"/>
豆子:
@Named
@ConversationScoped
public class Bean {
//code
@Inject
Conversation conversation;
public void HandleFileUpload(FileUploadEvent fileUploadEvent){
if(conversation.isTransient()){ //Always true :(
conversation.begin();
}
//Beans get created each time it needs to access this method.
}
【问题讨论】:
-
您在请求和会话中间寻找一个范围,即
@ViewScoped。如果您使用@RequestScoped来查找会话,那么您在某种程度上模拟了@ViewScoped并陷入 JSF 1.x(已解决)问题。 -
我无法从头顶回答这个问题,因为我从未真正使用过
@ConversationScoped。我只能说你可以使用MyFaces CODI 将JSF@ViewScoped注释透明地桥接到CDI,这样你基本上可以拥有一个@Named @ViewScopedbean。那对PF文件上传有用吗? -
@BalusC 您怎么可能没有使用过@ConversationScoped?是不是用的太少了?
-
直到今天,我一直在生产应用程序中使用 JSF 托管 bean。
-
没有必要跨步到 CDI。但在未来的应用程序中,如果 JSF 2.2 尚未推出,我们可能会与 CODI 结合使用。请注意,即将推出的 JSF 2.2 将获得一个新的
@FlowScoped注释,它与 CDI 兼容,并且实际上正是您想要跨越多个视图时所需要的。此外,@ViewScoped在 JSF 2.2 中最终将与 CDI 兼容。 JSF 就是通过这种方式慢慢转向 CDI。有关更多信息,另请参阅我的同事 Arjan Tijms 的这篇文章:jdevelopment.nl/jsf-22
标签: jsf primefaces cdi jboss-weld conversation-scope