JSF中资源处理程序中的会话范围?

时间:2011-11-22 18:15:06

标签: jsf-2 cdi jboss7.x

我有一个资源处理程序,需要访问在会话范围内工作的低级bean。我们的应用程序允许在同一浏览器会话中的不同浏览器选项卡上进行多个登录会话,方法是将登录详细信息保留在此范围内 - 因此数据库访问(我的资源处理程序)需要登录引用它的对话。

我尝试过只是期望它能够工作,甚至使用ExternalContext.encodeRedirectUrl()来尝试让Faces包含它所需的任何内容。

我已经尝试将?cid参数明确地放到我的请求路径上,所以我正在访问

/myapp/javax.faces.resource/thumbnail_3963075518712822225212162218.png.xhtml?ln=com.myapp.attachment&cid=1

资源处理程序中没有出现对话。

此外,如果我尝试使用Conversation.isTransient()进行测试,我会得到一个

javax.enterprise.context.ContextNotActiveException: Conversation Context not active when method called on conversation Transient conversation

(但我认为Conversation始终是活跃的,上面的堆栈跟踪包括org.jboss.weld.servlet.ConversationPropagationFilter!

我希望这与bug https://issues.jboss.org/browse/JBSEAM-3689无关 - 解决方法是“不要使用对话!”

还有更好的吗?

由于   - 理查德

4 个答案:

答案 0 :(得分:1)

看看Seam Faces,看看你是否可以按照自己的方式工作。 JSF在JSF 2.0和2.1规范中几乎与CDI不兼容。我们正在努力争取JSF的领先优势,使其更好地适用于JSF 2.2,对于给您带来的任何不便表示歉意。

答案 1 :(得分:0)

疯狂的想法 - 编写一个带有Restore View事件处理程序的XHTML页面,该处理程序手动呈现资源并在FacesContext上调用Complete()。啊!但是XHTML页面确实可以进行对话。

答案 2 :(得分:0)

我已经完成了错误报告中可能建议的内容。我找到了一种解决问题的方法,而不是使用Conversation Scope。在我的例子中,我有一个ThreadLocal,如果存在,它会为访问Conversation Scoped数据的组件提供备用信息。

答案 3 :(得分:0)

看看 Apache Myfaces CODI

对话管理的扩展程序非常棒