0

If I upgrade from Mojarra 2.1.21 to Mojarra 2.1.22, 23, 24, or 26, I became an error in my view. The error has something to do with binding. (Duplicate component id) because I had binding to sessionScoped bean properties. I have changed my bean to use EL-scoped binding. So my question:

  1. Is it safe to use EL-Binding and give a bound component as parameter and read(and set properties on this component). E.g.

    View:

     <p:dataTable binding="#{table}"> ...</p:dataTable>
     <p:commandButton action="#{bean.doit(table)}" />
    

    Bean:

     public void doit(DataTable dt) {
        dt.getSomething();
        dt.setSomething();
     }
    
  2. Why it's first happened from Mojara version 2.1.22 (this version number included) ?

4

1 回答 1

2

使用 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";
}

也可以看看:


为什么它首先发生在 Mojara 版本 2.1.22(包括这个版本号)?

这是 2.1.22 发行说明。到目前为止,我没有看到与这些症状严格相关的任何东西。所以,这显然是一个没有票的修复。也许一个开发人员偶然发现了一些伪造的代码,然后想,嘿,这不对,让我们现在修复它!我没有密切跟踪在没有票证的情况下执行的源代码的实际更改,所以很抱歉我无法回答那部分。

于 2013-09-30T12:29:18.037 回答