java - Wicket SelectOption<T> 在 Select<T> 进行的 getDefaultModelObject() 调用上返回 null

标签 java html wicket

我对问题的回答Dynamic <optgroup> support in wicket包括一个使用 WebMarkupContainer 和 SelectOptions 组件进行样式设置的选择框。

我实际上正在尝试在一个扩展 Form 的类中使用它,并使用具有“select”属性(以及其他属性)的 bean 作为父类(super class)构造函数中的CompoundPropertyModel。 MyBean 类型的 Bean 可以属于由 Group2Bean 表示的一个内部组,而其中的每一个又可以属于由 Group1Bean 表示的一个外部组。

代码(经过修改以隐藏 secret 性和数据库检索)大致如下:

选择的 HTML 代码:

<select wicket:id="select">
    <wicket:container wicket:id="outerRV">
        <optgroup wicket:id="optGroup1">
          <wicket:container wicket:id="rv">
            <optgroup wicket:id="optGroup2">
              <wicket:container wicket:id="selectOptions">
                <option wicket:id="option"></option>
              </wicket:container>
            </optgroup>
          </wicket:container>
        </optgroup>
    </wicket:container>
</select>

整个表单的Java代码:

public class MyForm extends Form<FilterBean> {

public MyForm(String id, FilterBean filterBean) {

super(id, new CompoundPropertyModel<FilterBean>(filterBean);

/*
 * ...code to get group1Beans and group2Beans...
 */

/* Select */
Select select = new Select("select");
select.setRequired(true);
add(select);

/* markup repeater for each group1 division */
RepeatingView rvOuter = new RepeatingView("outerRV");
select.add(rvOuter);

for(Group1Bean group1Bean : group1Beans){ /* for each group1 division */

    /* container with unique wicket ID */
    WebMarkupContainer overOptgroup1 = new WebMarkupContainer(rv.newChildId());
    rv.add(overOptgroup1);

    /* outer optgroup, name taken from group1Bean */
    WebMarkupContainer optGroup1 = new WebMarkupContainer("optGroup1");
    overOptGroup.add(optGroup1);
    optGroup1.add(
        new AttributeModifier("label",true,
                              new Model<String>(group1Bean.getName()
        ))
    );

    /* markup repeater for each group2 division */
    RepeatingView rv = new RepeatingView("rv");
    select.add(rv);

    for(Group2Bean group2bean : group2Beans){ /* for each group2 division */

      /* container with unique wicket ID */
      WebMarkupContainer overOptgroup2 =
              new WebMarkupContainer(rv.newChildId());
      rv.add(overOptgroup2);

      /* inner optgroup, name taken from group2Bean and indented */
      WebMarkupContainer optGroup2 = new WebMarkupContainer("optGroup2");
      overOptGroup.add(optGroup2);

      optGroup2.add(new AttributeModifier("style",true,
          new Model<String>("padding-left:15px")));

      optGroup2.add(new AttributeModifier("label",true,
          new Model<String>(group2Bean.getName())));

      /* fetches and displays MyBean options for selected group2 division */
      optGroup2.add(
          new SelectOptions<MyBean>(
              "selectOptions",fetchMyBeansUnder(group2Bean)
              new MyBeanRenderer()
          ).add(new AttributeModifier("style",true,
                   new Model<String>("padding-left="30px")))
      );
    }
}

问题是,模型的选择属性未更新。按下(默认)提交按钮会给我一个“需要选择”的反馈,即使我在生成的 web 应用程序界面上更改了我的选择,并尝试链接此组件以进一步失败,组件无法检索 select 属性的值。

尝试从 1.4.6 更新到 1.5.6,该版本具有通用 Select,但问题并未得到解决。扩展和摆弄 Select 使我将问题范围缩小到当选择的 SelectOption 返回 null 时 Select 的 inputConverter() (按下提交按钮后调用)在选项上调用 getDefaultModelObject()

大家有什么想法吗?非常感谢。

最佳答案

好吧,我发现了,一个愚蠢的错误。使用 SelectOption 的构造函数,模型不会自动为每个选项创建,而是由 MyBeanRenderer 的 getModel() 方法创建;我返回了一个空模型,而不是从 bean 参数创建的模型。我什至不认为它可能是渲染器...只需将该方法更改为以下方法即可:

public IModel<T> getModel(T bean){
    return new Model<T>(bean);
}

仍然不敢相信我花了几个星期的时间来研究这个,却没有看到这一点。

关于java - Wicket SelectOption<T> 在 Select<T> 进行的 getDefaultModelObject() 调用上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513833/

相关文章:

java - 当文件从 Git 同步到 Jenkins 工作区时,字符注入(inject)到 Java 类的字符串中

JavaDoc 提供完全限定的类名...如何缩写?

java - 从Java中的另一个类访问变量的实例

wicket - 在 wicket 应用程序中动态设置背景图像

java - Apache MINA 服务器在 60 秒后关闭 Activity UDP "session"

java - IE 将 JAX-RS Web 服务的字符串响应视为文件

javascript - 从 Iframe 调用时查找我的页面链接的真实域

html - 自动关闭 Sublime Text 3 中的 HTML 标签

java - Apache Wicket BackButton 支持浏览器兼容性问题

java - Wicket 应用程序可以在没有管理员密码的情况下触发自身重启吗?