java - Wicket - 生成动态表 - ChildId 警告

标签 java wicket

我正在尝试在 Wicket 口中创建一个动态表格组件来显示对象列表。该组件将接收对象列表并将其呈现为表格形式。

假设以下产品实体:

public class Product {
    public static final long serialVersionUID = 1L;
    //
    private String id; 
    private String name; 
    private String description; 
    private Double price; 
    // getters and setters omitted for brevity
}

以下 html/代码对将起作用:
(注意:产品实体稍后将被泛化,因此我们可以向其传递任何 POJO 的列表)

<table>
    <tbody>
        <tr wicket:id="row">
            <td wicket:id="cell">
                cell
            </td>
        </tr>
    </tbody>
</table>   
----------------------------------------------------------------
parameters: 
final String[] fieldNames = new String[]{"id", "name", "description", "price"};
List<Product> productList = .... 
----------------------------------------------------------------
ListView lvRows = new ListView("row", productList) {
    @Override
    protected void populateItem(ListItem item) {
        Product product = (Product)item.getModelObject(); 
        CompoundPropertyModel cpm = new CompoundPropertyModel(product);
        //
        RepeatingView cell = new RepeatingView("cell", cpm); 
        item.add(cell); 
        //                
        for (String fn : fieldNames) {                    
            Label label = new Label(fn); 
            cell.add(label); 
        }                
    }            
};
this.add(lvRows);

问题是上面的代码将导致一堆警告(列表中的每个产品一个):

00:57:52.339 [http-apr-8080-exec-108] WARN o.a.w.m.repeater.AbstractRepeater - Child component of repeater org.apache.wicket.markup.repeater.RepeatingView:cell has a non-safe child id of id. Safe child ids must be composed of digits only.

所以我的问题是:

  1. 我做错了吗?

  2. 如果没有,我该如何摆脱警告?

  3. 为什么在此实例中 wicket 需要数字子 ID?通过将 id 链接到对象属性,CompoundPropertyModel 在其他情况下工作正常...

  4. 如果我做错了,“正确”的方法是什么?我应该唯一地创建子 id,放弃使用CompoundPropertyModel,并直接通过反射提供值吗?但不确定对性能的影响,为每个单元进行反射调用并不便宜。像这样的事情:

    for(String fn:fieldNames}  {
      String s = ...; //find the value of Object O, property fn via Reflection
      Label label = new Label(cell.newChildId(), s);
      cell.add(label);
    }
    

提前致谢。

最佳答案

您可以通过在 RepeatingView 中添加中间子项来避免警告。 ,正如 Igor Vaynberg 在 this post 中所解释的那样在 Wicket 用户列表中。

换句话说,不要添加 Label将具有非数字 id 的容器直接添加到中继器,添加一个具有数字 id 的容器,然后添加 Label到容器:

RepeatingView cell = new RepeatingView("cell"); 
WebMarkupContainer container = new WebMarkupContainer(cell.newChildId(), cpm);
for (String fn : fieldNames) {                    
    Label label = new Label(fn); 
    container.add(label); 
}               
cell.add(container);
item.add(cell); 

该帖子中还概述了这些警告的原因。

编辑:

看来您需要建模 ProductPanel并在RepeatingView内使用它而不仅仅是 WebMarkupContainer 。这意味着ProductPanel可能必须在其 HTML 中显式枚举属性(或 wicket:id s)。

您也可以保留当前代码并执行Label label = new Label(cell.newChildId(), new PropertyModel(product, fn));如果您希望 HTML 独立于特定属性,请删除 CPM。

关于java - Wicket - 生成动态表 - ChildId 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20879616/

相关文章:

java - AssertJ:集合包含值以字符串结尾的元素

java - 为 Java HTTP GET 解码 InputStream

java - 元素也是类中的路径名

java - 将 Solr 安装到托管 tomcat 服务器上

java - Wicket:使生成的 csv 可用于 dygraphs JavaScript

java - Wicket 主页初始加载时模型未更新

Java "unchecked or unsafe operations"和Java自己的类

java - Wicket:ConverterLocato - 设置 IConverter 接口(interface)

java - Wicket:如何使用 Map 而不是 PropertyModel?

java - 需要一种策略来查找动态生成的下拉组件的属性