【问题标题】:Conversational Scope - Conversation Propagation对话范围 - 对话传播
【发布时间】: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 @ViewScoped bean。那对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


【解决方案1】:

我对 @ConversationScoped 有误解。

对话应该在访问给定链接之前开始。

意味着如果访问一个链接,之前没有开始对话,该 bean 的行为类似于 @RequestScoped bean。因此,每次刷新附加到 @ConversationScoped 的页面都会创建和销毁。

解决方案是在访问链接之前开始对话,因此 ?cid=10 将包含在 URL 中。

【讨论】:

  • 所以,基本上,您忘记了@PostConstruct public void init() { conversation.begin(); }?另见stackoverflow.com/questions/14384369/…
  • @BalusC 一点也不,如果对话尚未开始,这样做会产生大量对话。
  • 是的,没错。这也是@ConversationScoped 的权衡之一。
猜你喜欢
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2014-08-07
  • 2012-05-18
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多