JSF / Seam - 提交时的新组件实例?

时间:2010-03-23 16:45:37

标签: java jsf seam

我对JSF的困惑仍在继续。这是question asked yesterday的延续,但我觉得它值得一个新问题。我有一个接缝组件,需要注入一个URL参数,以便从方法中检索List<String>。这在第一次导航到页面时非常有效。 List用于显示填充selectOneRadio的许多不同<h:form/>组。

现在在提交时,我无法获取要在组件上注入或以其他方式设置的URL参数!添加<h:inputHidden/>会导致抛出FacesExceptions。

然后我尝试将List设置为对象的实例变量,并且当对提交进行后续调用时(我也不明白为什么这样做)我检查是否变量是非空的:如果不是,则返回它。

现在我发现在提交时创建了一个新的组件实例!!!

getList() called
this.toString(): .BeanAction@5fd98420

#### This is when submit is clicked
getList() called
this.toString(): .BeanAction@22aacbce

该组件具有以下注释:

Stateful
@Scope(ScopeType.CONVERSATION)
@Name("bean")
@Restrict("#{identity.loggedIn}")

有人可以解释为什么会创建一个新的组件实例吗? 我真的不太确定如何处理这个问题。我认为隐藏的参数是可行的,因为这就是我用直接HTML做的方式,我有点惊讶它不适用于JSF / Seam。

2 个答案:

答案 0 :(得分:2)

我找到了解决方案,但我仍然不明白为什么需要它。通过向<S:conversationId/>标记添加<h:commandButton/>,我现在可以在表单提交中传播conversationId。

然而,接缝文件说明:

If you don't do anything special, a non-faces request  (a GET request for example)
will not propagate the conversation context and will be processed in a new 
temporary conversation.

这意味着Seam / JSF将我的表单提交视为“非面孔请求”。那是为什么?

答案 1 :(得分:0)

当您进入页面时(或提交后),您是否在网址中看到对话ID?我担心Seam Conversation可能没有正确初始化。