Java Wicket-DropDownChoice+ChoiceRender-预选无效

Java Wicket-DropDownChoice+ChoiceRender-预选无效,java,wicket,Java,Wicket,我正在web应用程序中创建一个带有选择框的表单。我以下面描述的方式使用DropDownChoice+ChoiceRender组合。它工作得很好,但有一件事-in不会预先选择默认值 我已经为此挣扎了很长时间。我在网上找到了几个例子,据说这些例子对我有用,但对我不起作用 我的代码库似乎省略或简化了这些不相关的部分,以提高清晰度: 商业实体 刀 形式类 创建选择框 请注意,我将默认的多值类型实例设置为表单组件的CompundPropertyModel和DropDownChoice组件的模型。根据我在互

我正在web应用程序中创建一个带有选择框的表单。我以下面描述的方式使用DropDownChoice+ChoiceRender组合。它工作得很好,但有一件事-in不会预先选择默认值

我已经为此挣扎了很长时间。我在网上找到了几个例子,据说这些例子对我有用,但对我不起作用

我的代码库似乎省略或简化了这些不相关的部分,以提高清晰度:

商业实体

形式类

创建选择框

请注意,我将默认的多值类型实例设置为表单组件的CompundPropertyModel和DropDownChoice组件的模型。根据我在互联网上的发现,这应该足以让选择框在页面加载时预选相应的值,但它不起作用

我已经验证了从DAO获得的表单组件中的属性变量确实包含有效数据


还要注意的是,除了预选之外,一切都正常-我在表单的onSubmit方法中获得了正确填充的propertySettings变量。

我终于找到了问题所在

我意识到,当我显示表单时,Wicket会记录以下警告:

Model returned object ... which is not available in the list of selected objects.
基于该错误消息,我发现为了使默认选项的预选生效,业务实体必须覆盖equals方法,请参见。至少在我正在使用的Wicket版本1.5.4中


希望这能帮助其他遇到同样问题的人

你说对了!我还可以建议您对PropertySettings使用LoadableDetachableModel实现吗?如果多值类型的描述很长,它将为您节省一些内存。然后,您可以将该模型实例用于表单,并将其用作正在为选择框的选定选项实例化的PropertyModel的嵌套模型。查看此处以了解原因-此外,使用LoadableDetachableModel将确保页面的所有版本都使用最新的PropertySettings实例。感谢您的建议。你说得对,我更愿意使用LoadableDetachableModel作为表单模型。
public class PropertySettingsDao
{
    ...
    @Override
    public PropertySettings load(Long id)
    {
        String query = " ... query ... ";
        Object[] params = { id };
        return getJdbcTemplate().queryForObject(query, params, getRowMapper());
}
    ...
}
PropertySettings property = propertySettingsDao.load(propertyId);
IModel<PropertySettings> formModel = new CompoundPropertyModel<PropertySettings>(property);

Form<PropertySettings> form = new Form<PropertySettings>("editPropertyForm", formModel)
{
    @Override
    protected void onSubmit()
    {
        PropertySettings propertySettings = this.getModelObject();
        ...         
    }
};

form.add(createEnumSelectbox(multivalueTypeDao, new PropertyModel<MultivalueType>(property, "multivalueType"), "multivalueType", true));

add(form);
protected DropDownChoice<MultivalueType> createEnumSelectbox(DaoForEntityWithSurrogateKey<MultivalueType> dao, IModel<MultivalueType> model, String componentName, boolean required)
{
    // create the model
    IModel<List<MultivalueType>> choices = createModelForListView(dao);

    // prepare the select-box renderer
    ChoiceRenderer<MultivalueType> renderer = new ChoiceRenderer<MultivalueType>("label", "id");

    // create the select-box component
    DropDownChoice<MultivalueType> selectBox = new DropDownChoice<MultivalueType>
    (
        componentName,
        model,
        choices,
        renderer
    );

    // mark the select-box as a required form field
    selectBox.setRequired(required);

    return selectBox;
}

protected IModel<List<MultivalueType>> createModelForListView(final DaoForEntityWithSurrogateKey<MultivalueType> dao)
{
    return new LoadableDetachableModel<List<MultivalueType>>() 
    {
        @Override
        protected List<BO> load() 
        {
            return dao.loadAll();
        }
     };
}
Model returned object ... which is not available in the list of selected objects.