如果我从Mojarra 2.1.21升级到Mojarra 2.1.22,23,24或26,在我看来我就变成了一个错误。该错误与绑定有关。(重复的组件 ID(,因为我绑定了 sessionScoped bean 属性。我已经将我的 bean 更改为使用 EL 范围的绑定。所以我的问题:
-
使用 EL-Binding 并将绑定组件作为参数并读取(并在此组件上设置属性(是否安全? 例如
视图:
<p:dataTable binding="#{table}"> ...</p:dataTable> <p:commandButton action="#{bean.doit(table)}" />
豆:
public void doit(DataTable dt) { dt.getSomething(); dt.setSomething(); }
-
为什么它首先发生在 Mojara 版本 2.1.22(包括此版本号(?
使用 EL-Binding 并将绑定组件作为参数并读取(并在此组件上设置属性(是否安全? 例如
关键是,永远不应该将组件绑定为比请求范围更广的 Bean 的属性。UI 组件本质上是请求范围的。在构建/恢复视图期间,JSF 将检查 getter 是否尚未返回现有组件,然后重用它,而不是以通常的方式创建新组件。但是,如果 bean 从属于完全不同的视图的上一个/另一个请求/视图/会话返回一个已经创建的请求/会话,那么当状态发生冲突时,这一切都会失败。
在这个特定的解决方案中,您没有任何地方将组件引用为 Bean 属性,因此这是绝对安全的。但是,更好的办法是只绑定您真正感兴趣的特定组件属性,而不是整个组件:
<p:dataTable something="#{bean.something}">
跟
private String something;
public void doit() {
System.out.println(something);
something = "something new";
}
另请参阅:
- "绑定"属性在 JSF 中如何工作?何时以及如何使用它?
为什么它首先发生在 Mojara 版本 2.1.22(包括此版本号(?
以下是 2.1.22 发行说明。到目前为止,我没有看到任何与这些症状严格相关的内容。因此,这显然是一个没有票证的修复。也许一个开发人员偶然发现了一些虚假代码,然后想,嘿,这是不对的,让我们现在修复它!我没有密切跟踪在没有票证的情况下执行的源代码的实际更改,所以很抱歉我无法回答这部分。