Wicket DropDownChoice сохраняет объект в базу данных, а не поле - PullRequest
1 голос
/ 12 марта 2012

У меня проблема с реализацией выпадающего списка в моем коде.Я хочу отобразить список объектов типа 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 Ответ

3 голосов
/ 12 марта 2012

Ваша проблема в том, что объект модели за ddc имеет тип ProductCategory.При сохранении это будет приведено к типу String - как определено в вашем объекте модели за формой.

Я бы изменил код, чтобы в вашем списке выбора были только строки.

    public List<String> load() {
        List<String> pcChoices = new ArrayList<String>();
        for(ProductCategory pc : categoryService.findAllProducts()) {
            pcChoices.add(pc.getName());
        }
        return pcChoices;
    }

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

...