2

我只是想知道如何在 CDI 中开始新的对话。如果没有 cid 请求参数,容器似乎开始了一个新的对话,但在某些情况下,我想从我的控制器显式地开始一个新的对话。

示例:JSF 页面用于编辑会话范围控制器 bean 的实体保持。提交了一个 ajax 请求,调用控制器的方法,该方法触发一个事件,传递一个子实体,该子实体应在新对话中的不同控制器中编辑。我找不到该问题的解决方案。我已经研究了 Apache Myfaces CODI,但也找不到解决该问题的模式。

请帮我解决这个问题。

[编辑] 好的。也许我没有足够详细地描述问题。再试一次:如果我想访问具有不同(新)对话 ID 的“相同”对话范围控制器 bean 的新实例。这是如何运作的?您拥有的图像.. 可以说.. 一个 OrderControllerBean 来编辑一个 Order 实体。这个控制器有一个 JSF 操作方法,比如 public void createSubOrder()。这个方法应该创建一个新订单并用它做一些花哨的事情。之后,它应该被传递给具有不同对话 ID 的新 OrderControllerBean 实例。也许通过使用 CDI 事件。没关系。问题是:我的对话中已经存在 OrderControllerBean。它用于编辑当前订单。所以它不能用于创建和编辑我们刚刚创建的子订单。那么如何创建 OrderControllerBean 的新实例呢?也许这不是正确的方法。但到目前为止,如果不将浏览器发送到带有空白 cid 参数的新 url,我找不到另一个可能来创建新对话。但后来我无法在这些对话之间交换信息。如何将会话 1 中创建的非持久订单带到会话 2 中的同一控制器?我的问题只是关于对话的对话。如何将会话 1 中创建的非持久订单带到会话 2 中的同一控制器?我的问题只是关于对话的对话。如何将会话 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 示例,而不仅仅是一个简单的演示。如果有人有一个示例的链接,该示例显示了对话的高级使用,无论使用哪个便携式扩展,请告诉我。

4

3 回答 3

2

使用 CODI 可以自动开始 bean 的对话。只要您访问它。您可以同时进行多个对话。标准。CDI 对话更像是 CODI 的窗口范围。但即使在这里,CODI 也更好。

标准。CDI 对话需要#begin,但是当涉及到验证错误时,这是​​一个问题。在这种情况下,您会一遍又一遍地创建 bean。我放弃了标准的使用。两周后的 CDI 对话,因为在许多比一日演示更复杂的应用程序案例中,它们完全被破坏了。我发现http://os890.blogspot.co.at/2011/04/slides-codi-conversations.html帮助我理解了为什么 CODI 团队做自己的 CDI 范围。

此外,您所描述的对于 CODI 来说也很容易。

[编辑]: 如果没有第二个 bean,您在“编辑”中添加的内容根本无法工作,但您永远不会获得新的窗口 ID。如果您只需要会话范围 bean 的新(/重新启动)实例,您可以使用:org.apache.myfaces.extensions.cdi.core.api.scope.conversation.Conversation#restart 您需要一个调用的第二个 bean比如controller#getXyz controller#restart(它本身调用Conversation#restart),然后是controller#setXyz。但是,您尝试做的事情听起来很肮脏。

于 2012-12-08T00:00:46.917 回答
0

“触发事件”是什么意思?JSF、ajax、CDI 事件?
为什么要为您的子实体开始新的对话?
我认为您应该以某种方式从客户端请求子实体编辑页面而不附加 cid。使子实体的控制器获得新的瞬态会话。然后你可以用它的方法开始它@PostConstruct。AFAIK 你不能在同一个请求中开始新的(或重新开始)对话。

于 2012-12-07T19:48:31.057 回答
0
   @Inject
   private Conversation conversation;

conversation.begin();
conversation.end();

很容易谷歌这个?究竟是什么问题?

于 2012-12-07T18:13:01.490 回答