2012-03-05 82 views
1

虽然在一个不受欢迎的对话中,我需要为这个bean启动一个新的对话。新的CDI对话

情况如下:我有一个带有cdi bean的jsf页面来处理创建和更改订单。在页面的菜单中有一个项目是“新订单”。因此,在更改订单时,我需要点击“新订单”,并且必须使用新的CID和新的对话范围刷新页面。但是,如果我尝试这样做,即使我先调用conversation.end()和conversation.begin(),conversation.getConverstaionId()也会始终返回相同的值。

编辑:

我有一个页面来编辑订单。当点击一个新的按钮(菜单)时,我希望它刷新并开始新的对话,以添加新的订单。所以这个按钮调用方法redirectToNewOrderPage()。但它有代码和之前描述的问题。

@Named 
@ConversationScoped 
public class OrderEditBean implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Inject 
    private Conversation conversation; 

    [...] 


    public void redirectToNewOrderPage() { 
     String cid = createNewConversationId(); 
     setOrder(null); 
     try { 
      FacesContext.getCurrentInstance().getExternalContext().redirect("/OrdersManager/restricted/orders/edit.xhtml?cid=" + cid); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private String createNewConversationId() { 
     String oldConversationId = null; 
     String newConversationId = null; 
     oldConversationId = conversation.getId(); 

     if (!conversation.isTransient() && conversation.getId() != null) { 
      conversation.end(); 
     } 

     conversation.begin(); 
     newConversationId = conversation.getId(); 

     // ************** 
     // at this point newConversationId is equal to 
     // oldConversationId if the conversation was NOT transient. 
     // ************** 

     return newConversationId; 
    } 

} 

回答

1

你正在做什么,不起作用。 CDI中的对话范围不如Seam 2中的对话范围(如果那是你的来源)。

+0

你有什么想法吗?我只需要重定向到同一页面,但是用新的对话... – dgimenes 2012-03-06 20:11:12

+0

不,对不起。也许如果你挖入impl并看看它的apis。 – LightGuard 2012-03-08 16:08:36

+0

没关系。谢谢! – dgimenes 2012-03-13 17:45:21