我只是想知道如何在CDI中开始新的对话。 如果没有cid请求参数,容器似乎开始一个新的对话,但在某些情况下我想从我的控制器开始一个新的对话。
示例:JSF页面用于编辑会话范围控制器bean的enity hold。提交ajax请求,调用控制器的方法,该方法触发事件,传递应在新会话内的不同控制器中编辑的子实体。 我找不到解决这个问题的方法。 我已经查看了Apache Myfaces CODI,但也无法找到解决该问题的模式。
请帮助我。
[编辑] 好。也许我没有详细描述这个问题。再试一次: 如果我想访问具有不同(新)会话ID的“相同”会话控制bean的新实例。这是如何运作的?你有的图像..让我们说..一个OrderControllerBean来编辑一个Order实体。这个控制器有一个像public void createSubOrder()这样的JSF动作方法。这个方法应该创建一个新订单,并用它做一些奇特的东西。之后,它应该传递给具有不同会话ID的新OrderControllerBean实例。也许通过使用CDI事件。无所谓。问题是:OrderControllerBean已存在于我的对话中。它用于编辑当前订单。因此它不能用于创建和编辑我们刚刚创建的子订单。那么如何创建OrderControllerBean的新实例呢? 也许这不是正确的方法。但到目前为止,我无法找到另一个可能创建新会话,而无需将浏览器发送到带有空白cid参数的新网址。但后来我无法在这些对话之间交换信息。如何将会话1中创建的非持久性订单带到会话2中的同一个控制器?我的问题只是谈话的对话。
[编辑] 我阅读了整个文档以及到目前为止随附的所有示例。 根据这些声明(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#conversationcontext),CDI对话似乎与JSF密切相关。不幸的是,我找不到更深入到技术细节的文档。由于没有其他方法可以获得新会话作为发送新请求,因此有必要保留关于新会话如何以及何时直接在视图层中开始的逻辑。这绝对不是我能想象的最佳方式。我的下一次尝试是对Seam 3的评估,因为我记得在Seam 2中有一些@Begin和@End注释可以更好地控制对话。还有一些标记库可以让您指定对话传播。我想知道为什么没有其他人有类似的问题。对于复杂的项目来说,CDI目前还不是很普遍,或者我在理解事情应该如何运作方面遇到了很大的问题。到目前为止,我找不到任何CDI / CODI示例,它不仅仅是一个简单的演示。如果有人链接到显示对话的高级使用的示例,无论使用哪种便携式扩展,请告诉我。
答案 0 :(得分:2)
使用CODI,bean的对话开始自动启动。一旦你访问它。您可以并行进行多个对话。标准。 CDI对话更像是CODI的Window-Scope。但即使在这里,CODI也会更好。
标准。 CDI对话需要#begin,但这是一个问题,例如验证错误。在这种情况下,您反复创建bean。我放弃了std的用法。两周之后的CDI对话,因为在许多应用程序中它们完全被打破,这些应用程序比一天的演示更复杂。我发现http://os890.blogspot.co.at/2011/04/slides-codi-conversations.html帮助我理解为什么CODI团队制作了自己的CDI范围。
您所描述的内容也很容易与CODI一起使用。
<强> [编辑]:强> 你在'EDIT'中添加的内容在没有第二个bean的情况下根本无法工作,但你永远不会得到一个新的window-id。 如果您只需要对话范围bean的新(/重新启动)实例,则可以使用: org.apache.myfaces.extensions.cdi.core.api.scope.conversation.Conversation#重启 你需要一个第二个bean来调用控制器#getXyz controller#restart(它本身称为Conversation #re restart)然后调用控制器#setXyz。但是,这听起来非常糟糕。
答案 1 :(得分:0)
@Inject
private Conversation conversation;
conversation.begin();
conversation.end();
这很容易谷歌吗?究竟是什么问题?
答案 2 :(得分:0)
“射击事件”是什么意思; JSF,ajax,CDI事件?
您为什么要为您的子实体开始新的对话?
我认为你应该以某种方式从客户端请求子实体编辑页面而不附加cid。这样子实体的控制器就可以获得新的瞬态对话。然后,您可以使用其@PostConstruct
方法开始它。 AFAIK您无法在同一请求中启动新的(或重新启动)对话。