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

Lista de preco chegando vazia no controle

Boa noite

Adicionei a funcionalidade de atualizar o produto, porém estou com dificuldade de passar essa lista de preco da JSP para o controller. Eu acho que o bingind não esta sendo feito, por favor alguem poderia me dar uma força ?

JSP

                <!-- Atualiza -->
                <c:if test="${produto != null}">
                <input type="hidden" name="id" value="${produto.id}"/>
                <c:forEach items="${produto.precos}" var="tipoPreco" varStatus="status">
                    <div class="form-group col-md-4">
                        <label for="labelTipoPreco">${tipoPreco.tipo}</label>
                        <input class="form-control" type="text" id="labelTipoPreco" name="${tipoPreco.valor}" value="${tipoPreco.valor}" >
                        <input type="hidden" name="${tipoPreco}" value="${tipoPreco}">
                    </div>        
                </c:forEach> 
                </c:if>

Controller

    @RequestMapping("/cadastrar")
    public String gravar(Produto produto, RedirectAttributes redirectAttributes) {

        System.out.println(produto);

        if (produto != null && produto.getId() == 0) {
            produtoDao.gravar(produto);
        } else {
            produtoDao.atualizar(produto);    
        }
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");
        produtoDao.listar();

        return "redirect:/produtos";
    }
6 respostas

Renato, tudo bem ?

Consegue mostrar para gente seus modelos ?

Boa tarde Matheus, tudo sim e você ?

Segue o modelo

package br.com.casadocodigo.loja.models;

import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;

    @ElementCollection(fetch=FetchType.EAGER)    
    private List<Preco> precos;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public int getPaginas() {
        return paginas;
    }

    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }

    public List<Preco> getPrecos() {
        return precos;
    }

    public void setPrecos(List<Preco> precos) {
        this.precos = precos;
    }

    @Override
    public String toString() {
        return "Produto [id=" + id + ", titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas
                + ", preco=" + precos + "]";
    }

}
package br.com.casadocodigo.loja.models;

public enum TipoPreco {

    EBOOK, IMPRESSO, COMBO
}
package br.com.casadocodigo.loja.models;

import java.math.BigDecimal;

import javax.persistence.Embeddable;


@Embeddable
public class Preco {

    private BigDecimal valor;
    private TipoPreco tipo;

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

    public TipoPreco getTipo() {
        return tipo;
    }

    public void setTipo(TipoPreco tipo) {
        this.tipo = tipo;
    }

}

Renato,

Um chute mesmo é que acho que você precisa instanciar a lista para ela ter referencias acessáveis.

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;

    @ElementCollection
    private List<Preco> precos = new ArrayList();

Vê se isso rola

Matheus, o produto vem do banco com uma lista de precos. Mas posso tentar :)

Um produto com uma lista de preço é carregada no controller para edição, assim que faço as alterações e envio para atualização, o preço acaba chegando assim 'precos[]' vazio ai no merge a referencia do produto acaba sendo removida da tabela produto_precos.

Boa tarde Matheus

Fiz a alteração que você comentou, não funciono :/

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;

    @ElementCollection(fetch=FetchType.EAGER)
    private List<Preco> precos = new ArrayList<Preco>();

    // setter e getter

Meu toString da imprimindo dessa forma:

Produto [id=39, titulo=Java 8, descricao=Novas funcionalidades, paginas=400, precos=[]]
solução!

Boa noite

Consegui solucionar o problema. A forma em que estava sendo passada a lista de preços estava errada, estava passando assim:

<div class="form-group col-md-4">
                        <label for="labelTipoPreco">${tipoPreco.tipo}</label>
                        <input class="form-control" type="text" id="labelTipoPreco" name="${tipoPreco.valor}" value="${tipoPreco.valor}" >
                        <input type="hidden" name="${tipoPreco}" value="${tipoPreco}">
                    </div>

quando deveria estar passando dessa forma:

<div class="form-group col-md-4">
                        <label for="labelTipoPreco">${tipoPreco.tipo}</label>
                        <input class="form-control" type="text" id="labelTipoPreco" name="precos[${status.index}].valor" value="${tipoPreco.valor}" >
                        <input type="hidden" name="precos[${status.index}].tipo" value="${tipoPreco.tipo}">
                    </div>