Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

Persistir campo select com valor fixo

Boa tarde pessoal!

Eu não estou conseguindo persistir campos do tipo "select", que possuem valores fixos (Sim/Não) como por exemplo:

<label>Promoção:</label> 
    <select name="produto.promocao" id="promocao" class="form-control" data-select="sl" data-url="sl">
        <option value="S">Sim</option>
        <option value="N">Não</option>
    </select>

**Eu consegui fazer a persistência de campos do tipo "select", que carregam informações vindas de tabelas, lendo a documentação do VRaptor, adicionei os métodos que carregam a informação na chamada do form, e tanto para cadastrar quanto para editar um registro a persistência ficou OK!!!

No meu ProdutoDao, eu tenho o método atualiza(), que por sua vez chama o método buscaPorId(), para carregar o registro correto:

public Produto atualiza(Integer id, Result result) {
    Produto produto = this.buscaPorId(id);
        return produto;
    }

public Produto buscaPorId(Integer id) {
    try {
        TypedQuery<Produto> query = manager.createQuery("Select p from Produto p Where p.id = :id", Produto.class);
        query.setParameter("id", id);
        return query.getSingleResult();
        } catch (Exception e) {
            return null;
        }
    }

No meu form.jsp:

<label>Produto em promoção:</label>
<select name="produto.promocao" id="promocao" class="form-control" data-    select="sl" data-url="sl">
    <option value="S">Sim</option>
    <option value="N">Não</option>
</select>

Porém se eu tentar atualizar um registro da tabela Produto, que tiver promocao como "N", ao selecionar esse registro o form.jsp, carrega "S" no registro, por ser o primeiro item da lista...

Resumindo Não está persistindo a informação do atributo, para esse tipo de campo "select"...

OBSERVAÇÃO : Me pediram para evitar ao MÁXIMO o uso de JAVA SCRIPT no projeto.

Obrigado!

13 respostas

Acho que faltou vc colocar o if na option para decidir qual deve aparecer selected. O código em si não parece ter um problema... Pelo código, ele vai setar o valor S ou N na promoção e isso deveria ficar no seu banco.

Bom dia Alberto!

Eu alterei o código para:

<select name="produto.promocao" id="promocao" class="form-control" data-select="sl" data-url="sl">
    <c:choose>
        <c:when test="${produto.promocao}.equals('')"> 
            <option value="S">Sim</option>
            <option value="N">Não</option>
        </c:when>
        <c:otherwise>
            <option value="${produto.promocao}">${produto.promocao}</option>
        </c:otherwise>
    </c:choose>
</select>

**Dessa forma NÃO carrega a lista (Sim/Não), quando eu vou fazer um novo cadastro, porém PERSISTE o atributo quando eu vou editar um registro...

Alterei para:

<c:when test="${produto.promocao} == null">

E continuou da msm forma...

Não precisa fazer usar o when. Basta fazer ${produto.promocao == 'S' ? 'selected' : ''} na option do s. E faz o mesmo para a option do n. Isso eh o suficiente para escolher alguma, caso o produto esteja com a promoção. Agora o que vc precisa ver, eh se o valor está sendo colocado no produto. Debugue o código do controller... Com sysout ou o debugar mesmo.

Adicionei:

<option value="${produto.promocao == 'S' ? 'selected' : ''}">Sim</option>
<option value="${produto.promocao == 'N' ? 'selected' : ''}">Não</option>

Carrega a lista no momento em que eu chamo o form.jsp, porém NÃO grava a informação, tanto para um novo registro quanto para editar um existente. E também NÃO persistiu a informação do registro...

Então o problema tá no controller pra dentro. Como eu disse, essa parte aí tá OK.. vc precisa conferir as informações que chegam no controller até achar o ponto do problema. Isso eh bem normal, tem que testar até encontrar.

Desculpe Alberto, mas o controller não está com problemas... Eu adicionei 2 syso... Um do campo select que carrega as informações de uma tabela, e outro do campos "pomocao" e no console mostra a informação correta tanto no método salva, como no atualiza... O problema é que quando eu chamo o form, pelo método atualiza, os select´s com valor fixo (s/n) carregam o primeiro item, que no caso é "Sim"...

    // MÉTODO SALVA:

    @IncludeParameters
    public void salvaVaz(@Valid Produto produto) {
        validator.onErrorRedirectTo(this).formVaz();
        System.out.println("ProdutoController-SALVA, ANTES do salva - descricaoTipoProduto: " + produto.getDescricaoTipoProduto());
        System.out.println("ProdutoController-SALVA, ANTES do salva - promocao: " + produto.getPromocao());
        produtoDao.salva(produto);
        System.out.println("ProdutoController-SALVA, DEPOIS do salva - descricaoTipoProduto: " + produto.getDescricaoTipoProduto());
        System.out.println("ProdutoController-SALVA, DEPOIS do salva - promocao: " + produto.getPromocao());
        result.redirectTo(this).listaVaz();
    }
    // MÉTODO ATUALIZA:

    public void atualizaVaz(Integer id, Result result) {
        Produto produto = produtoDao.buscaPorId(id);
        System.out.println("ProdutoController-ATUALIZA, ANTES do include  - descricaoTipoProduto: " + produto.getDescricaoTipoProduto());
        System.out.println("ProdutoController-ATUALIZA, ANTES do include - promocao: " + produto.getPromocao());
        result.include(produto);
        System.out.println("ProdutoController-ATUALIZA, DEPOIS do include  - descricaoTipoProduto: " + produto.getDescricaoTipoProduto());
        System.out.println("ProdutoController-ATUALIZA, DEPOIS do include - promocao: " + produto.getPromocao());
        listaTipoProduto("VAZ");
        listaMontadora("VAZ");
        result.of(this).formVaz();
    }

Entendi. Bom, se ta salvando e atualizando corretamente e vc acha que a página está correta. O problema sobrou no formVaz.. Cadê o código do formVaz()? Se lá dentro vc instancia um novo produto e adiciona no result, vc está sobrepondo o que vc coloca no atualizaVaz. O melhor era vc ter um formVaz() que recebe o id do produto que vc quer editar, para carregar ele do banco e mandar o objeto correto para a página.

Você prefere que eu exporte o projeto, e disponibilize no Drive, acho q fica mais fácil... Pode ser ?

Coloca no github entao. Mais fácil de olhar e comentar.

Desculpe Alberto, mas máquinas da empresa são bloqueadas, não consegui instalar o GIT... Subi no Drive => https://drive.google.com/drive/folders/0B1n2t9Tjxu9GckdsZEowUGRxT2s?usp=sharing

Você está me ajudando nos três posts, podemos tentar resolver nessa ordem:

1º => https://cursos.alura.com.br/forum/topico-como-sincronizar-um-campo-input-e-um-campo-input-no-jsp-31736

**Enquanto isso eu tento implementar esse... 2º => https://cursos.alura.com.br/forum/topico-trabalhar-com-imagens-externas-no-vraptor-31727

Por ultimo agente vê o form... 3º => https://cursos.alura.com.br/forum/topico-persistir-campo-select-com-valor-fixo-31732

Muito obrigado pela atenção!!!

Opa, vou olhar, mas o que vou fazer é tentar achar o erro e te dizer. A implementação fica por sua conta.

solução!

Resolvido !!!