JSF CDI(焊接)开始新的对话

JSF CDI(焊接)开始新的对话,jsf,cdi,codi,Jsf,Cdi,Codi,我只是想知道如何在CDI中开始新的对话。 如果没有cid请求参数,容器似乎开始新的对话,但在某些情况下,我希望从控制器显式启动新对话 示例:JSF页面用于编辑会话范围控制器bean的enity保持。提交一个ajax请求,调用控制器的一个方法,该方法触发一个事件,传递一个子实体,该子实体应在新对话中的另一个控制器中进行编辑。 我找不到解决那个问题的办法。 我已经研究了ApacheMyFacesCodi,但也找不到解决该问题的模式 请帮我解决这个问题 [编辑] 好啊也许我对这个问题描述得不够详细。再

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

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

请帮我解决这个问题

[编辑] 好啊也许我对这个问题描述得不够详细。再试一次: 如果我想访问具有不同(新)会话id的“相同”会话作用域控制器bean的新实例,这是如何工作的?你的形象。。让我们说。。用于编辑一个订单实体的OrderControllerBean。此控制器有一个JSF操作方法,如public void createSubOrder()。这个方法应该创建一个新的订单,并用它做一些有趣的事情。之后,它应该被传递到一个新的OrderControllerBean实例,该实例具有不同的会话id。可能通过使用CDI事件。没关系。问题是:OrderControllerBean已经存在于我的对话中。用于编辑当前订单。因此,它不能用于创建和编辑我们刚刚创建的子订单。那么,如何创建OrderControllerBean的新实例呢? 也许这不是正确的方法。但到目前为止,如果不将浏览器发送到带有空白cid参数的新url,我无法找到另一个可能创建新对话的url。但是我不能在这些对话之间交换信息。如何将在对话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示例不仅仅是一个简单的演示。如果任何人有一个显示高级对话使用的示例链接,无论使用哪种便携式扩展,请告诉我

   @Inject
   private Conversation conversation;

conversation.begin();
conversation.end();
用谷歌搜索这个很容易吗?到底是什么问题?

你所说的“触发事件”是什么意思;JSF、ajax、CDI事件?
为什么要为子实体启动新对话?

我认为您应该以某种方式从客户端请求子实体编辑页面,而不附加cid。使子实体的控制器获得新的瞬态对话。然后可以在其
@PostConstruct
方法中开始它。抱歉,您不能在同一请求中启动新的(或重新启动)对话。

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

标准CDI对话需要#开始,但当涉及到验证错误时,这是一个问题。在这种情况下,您会一次又一次地创建bean。两周后,我放弃了使用std.CDI对话,因为在许多比一天演示更复杂的应用程序中,这些对话完全被破坏了。我发现这有助于我理解为什么CODI团队使用他们自己的CDI示波器

另外,你所描述的CODI也很简单

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

我指的是CDI事件。问题是,我知道如何开始新的CDI对话的唯一方法是打开一个带有空白cid参数的新网页。不可能在控制器逻辑中获得新对话,也不可能稍后将用户重定向到相应页面(可能)。jsf前端始终需要知道对话的进展情况,但我希望在控制器逻辑中管理对话,因为我的应用程序太复杂,无法将所有这些内容放入jsf页面。谢谢你的回复。我阅读了所有CODI文档,但找不到任何关于开始新对话的信息。有命名的对话组等等,但这不是我需要的。我只想从后端的某个地方开始一个新的、未修改的、独立的对话,而不提交新的浏览器请求。你不必开始它们!只要访问bean,其余的就可以了。你也