【问题标题】:JSF/Mojarra "flash scope" problemsJSF/Mojarra“闪存范围”问题
【发布时间】:2011-06-18 19:16:13
【问题描述】:

我有一个在 Mojarra 2.1.1 / Glassfish 3.1 上运行的应用程序,现在已经增长到 150,000+ 代码行。该应用程序将 ajax 与 ViewScoped 托管 bean 和 page-redirect-get 模式(即 faces-redirect=true)。

一直让我烦恼的一件事是明显缺乏通过的便利性 页面到页面和 bean 到 bean 的参数(每个页面都有自己的支持 bean)。

我无法让闪光灯正常工作。我通常需要访问我拥有的数据 在下一页的 preRenderView 事件监听器中写入 flash。这不 可靠地工作,尤其是在应用程序重新部署之后。

我已阅读 CDI 并花了几天时间尝试从 JSF 托管 bean 迁移 到 CDI bean,但不能让它工作。好像有很多兼容性问题 在 Seam 3 和 Glassfish 3.1 之间。我将 Weld 升级到 1.1.1,但这并没有帮助。从 我的观点是它目前不起作用。例如,当我说不起作用时 我有一个页面试图将 h:inputText 转换为支持 bean 中的字符串,但这没有 工作,非常简单的东西。

由于我遇到的 CDI 问题,我无法使用 @RenderScoped 中的接缝面 一个非常简单的测试应用程序(即使在 g/f 3.1 上)只是我想要的,但不是在 复杂的主应用程序。

目前我能找到的唯一可靠的机制是 URL 参数,它是 安全噩梦。尽管已尽一切努力确保对数据的访问是 经过适当的身份验证,总会有丢失某些东西的变化,并且看到 ...xhtml?id=51031 或浏览器中的任何内容对于某些人来说太过分了 尝试其他ID。我写了一个混淆转换器来避免明文,不要 为名称/值对使用有意义的名称,但这不会到达 问题。

我只是想知道我是否在这里遗漏了一些东西,其他人有没有可行的解决方案 对这个问题,即使在 glassfish 上?我是不是太担心了,应该坚持使用 URL 参数?还有其他建议吗?

谢谢。

【问题讨论】:

  • I've not been able to get the flash working. - 你能详细说明一下吗?
  • Mojarra 在下一个请求的 preRenderView 侦听器中可靠地访问写入闪存的值时存在问题。大约一年前我登录了一个 JIRA,他们计划在 Mojarra 2.2 中修复它。重新部署应用程序或重新启动服务器后会出现此问题。似乎有很多用例表明 Flash 不能可靠地工作。

标签: jsf glassfish cdi mojarra


【解决方案1】:

我也看到了。在我尝试的时候,Seam3 有很多 bug,很难将它部署到不同的服务器上。我切换到MyFaces CODI,它从一开始就没有任何问题。在你的情况下,你应该看看@ViewAccessScoped。您可以摆脱所有这些烦人的解决方法。

【讨论】:

  • 碰巧我在几周前切换到了 CODI ViewAccessScoped,它解决了我所有的问题。在某些情况下,我也会使用对话组。这绝对是要走的路,也是很好的建议。我希望一年前能找到这个。为了不使用 CODI 的任何人的利益,请注意它可以与 Mojarra 一起正常工作,并且不需要 Myfaces 实现。如果您使用的是 ManagedBean 和 javax.faces.bean....范围注释 CODI 会拦截这些,因此只需将依赖项添加到您的项目中,您就可以切换到 CDI 而无需进行任何代码更改。太棒了!
【解决方案2】:

声明你想设置或传递到下一个视图的参数

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
</f:metadata>

这在 GET 请求的更新模型值阶段基本上是 bean.setFoo(request.getParameter("foo"))

如果在导航结果中添加includeViewParams=true参数,则当前视图中声明为&lt;f:viewParam&gt;的参数将传递到下一个视图。

public String doSomething() {
    // ...
    return "next?faces-redirect=true&amp;includeViewParams=true";
}

(注意:&amp;amp; 很重要!&amp; 不起作用,因为它不是 XML 有效的)

下一个视图应该有相同的&lt;f:viewParam&gt; 才能让它们在bean 中设置。以此类推。

【讨论】:

  • 查看参数是我正在使用的,抱歉我没有说清楚,阅读你所有的博客,Burns/Geary 书籍,页面脱落。对于像注册页面这样的非持久性数据,我可以有 13 项数据,13 X setPropertyActionListeners+f:viewParam。但仅尝试在同一 jvm 中的同一 Web 容器中逐页传递对象引用。使用持久数据必须传递主键,有一个转换器,在 getAsObject() 方法中执行 EntityManager.getReference()。一定有更好的方法。是否有可以处理集群和多个浏览器选项卡的会话映射解决方案?
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多