Wicket DropDownChoice сохраняет объект в базу данных, а не поле
У меня проблема с реализацией выпадающего списка в моем коде. Я хочу отобразить список объектов типа ProductCategory. Это все хорошо, но когда я пытаюсь сохранить форму, сохраняется весь объект ProductCategory, а не только поле из объекта, которое отображается в списке выбора.
Вот как выглядит мой код:
IModel categories = new LoadableDetachableModel() {
public List<ProductCategory> load() {
List<ProductCategory> l = categoryService.findAllProducts();
return l;
}
};
IChoiceRenderer renderer = new IChoiceRenderer() {
public Object getDisplayValue(Object obj) {
ProductCategory category = (ProductCategory) obj;
return category.getName();
}
public String getIdValue(Object obj, int index) {
ProductCategory category = (ProductCategory) obj;
return category.getName();
}
};
DropDownChoice<ProductCategory> listCategories = new DropDownChoice<ProductCategory>(
"productCategory",
categories,
renderer
);
add(listCategories);
Сгенерированный HTML выглядит примерно так:
<select wicket:id="productCategory" name="productCategory">
<option selected="selected" value="">Vælg en</option>
<option value="test1">test1</option>
<option value="test2">test2</option>
</select>
Поле "productCategory" существует в объекте типа "Product" и имеет тип String.
Как я пытался описать; я хочу сохранить ProductCategory.getName() в поле "productCategory" в Product, а не весь объект ProductCategory. Другими словами: я хочу сохранить "test1" в Product.productCategory, но вместо этого он сохраняет com.test.webapp.domain.ProductCategory@1.
Может кто-нибудь сказать, пожалуйста, как это делается?
Буду признателен за любую оказанную помощь.
1 ответ
Ваша проблема в том, что объект модели позади ddc имеет тип ProductCategory. При сохранении это будет приведено к типу String - как определено в вашем объекте модели за формой.
Я бы изменил код, чтобы в вашем списке выбора были только строки.
public List<String> load() {
List<String> pcChoices = new ArrayList<String>();
for(ProductCategory pc : categoryService.findAllProducts()) {
pcChoices.add(pc.getName());
}
return pcChoices;
}
Делая так, вы также можете избавиться от выбранного вами рендерера.