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;
    }

Делая так, вы также можете избавиться от выбранного вами рендерера.

Другие вопросы по тегам