我正在Web应用程序中创建带有选择框的表单。我以下面描述的方式使用DropDownChoice + ChoiceRenderer组合。它工作正常,但有一点- in不预先选择默认值。
我已经为此奋斗了很长时间。我在互联网上找到了几个可以正常工作的示例,但对我却不起作用。
我的代码库如下所示(不相关的部分已被省略或简化以提高清晰度):
商业实体
public class MultivalueType { private Long id; private String label; private String description; public MultivalueType(Long id, String label, String description) { this.id = id this.label = label; this.description = description; } public Long getId() { return id; } public String getLabel() { return label; } public String getDescription() { return description; } } public class PropertySettings { private Long id; private String property; private MultivalueType multivalueType; public PropertySettings(Long id, String property, MultivalueType multivalueType) { this.id = id; this.property = property; this.multivalueType = multivalueType; } public MultivalueType getMultivalueType() { return multivalueType; } }
道
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(); } }; }
请注意,我将默认的MultivalueType实例(冗余地)设置为Form组件的CompundPropertyModel和直接设置为DropDownChoice组件的模型。根据我在Internet上的发现,这足以使选择框在页面加载时预选择相应的值,但它不起作用。
我已经验证了Form组件(从DAO获得)中的属性变量确实包含有效数据。
还要注意,除了预选之外,其他所有方法都工作正常-我在表单的onSubmit方法中正确填充了propertySettings变量。
我终于设法找到了问题。
我已经意识到,当我显示表单时,Wicket会记录以下警告:
Model returned object ... which is not available in the list of selected objects.
根据该错误消息,我发现,为了使默认选项有效,业务实体必须重写equals方法(请参阅相应的JIRA故障单)。至少在我正在使用的Wicket版本1.5.4中。
希望这可以帮助其他会遇到相同问题的人!