Pergunta

Estou com um problema ao implementar o dropdownchoice no meu código.Quero exibir uma lista de objetos do tipo ProductCategory.Está tudo bem, mas quando tento salvar o formulário, todo o objeto ProductCategory é salvo, e não apenas o campo do objeto que é exibido na lista de seleção.

Aqui está a aparência do meu código:

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

O HTML gerado é mais ou menos assim:

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

O campo “productCategory” existe em um Objeto do tipo “Produto”, e é do tipo String.

Como tentei descrever;quero salvar ProductCategory.getName() no campo "productCategory" em Produto, e não em todo o objeto ProductCategory.Em outras palavras:Quero salvar "test1" em Product.productCategory, mas em vez disso ele salva com.test.webapp.domain.ProductCategory@1.

Alguém pode dizer como isso é feito?

Qualquer ajuda é muito apreciada.

Foi útil?

Solução

Seu problema é que o objeto modelo por trás do ddc é do tipo ProductCategory.Ao salvar, isso será convertido para o tipo String - conforme definido no seu objeto de modelo atrás do formulário.

Eu mudaria o código para ter apenas strings na sua lista de opções.

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

Fazendo isso, você também pode se livrar do renderizador de sua escolha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top