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

Campos nulos ao adicionar

Desde o início quando estava testando o adicionar, os campos ficavam nulos, porém adicionava. Não me preocupei antes, mas agora comecei testar as validações e não está funcionando.

Debugando vi que nenhum valor do formulário está sendo passado para o método adiciona da classe ProdutoController. Como são parâmetros de entrada do início do processo, isso deveria já vir preenchido, por este motivo não sei nem por onde começar.

Por favor poderiam me auxiliar para descobrir o problema? Consigo saber o conteúdo ${produto.campo} da jsp em tempo de debug?

Obrigada.

formulario.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../base.css">
<title>Novo formulário</title>
</head>
<body>

<form action="<c:url value="/produto/adiciona" />" method="post">
    Nome:<input class="form-control" type="text" name="${produto.nome }" />
    Valor:<input class="form-control" type="text" name="${produto.valor }" />
    Quantidade:<input class="form-control" type="text" name="${produto.quantidade }" />
    <input class="btn btn-primary" type="submit" name="adiciona" value="Adicionar" />
</form>

<c:forEach items="${errors}" var="erro">
    ${erro.category } - ${erro.message}
</c:forEach>


</body>
</html>

ProdutoController

package br.com.caelum.vraptor.controller;

import java.util.List;

import javax.inject.Inject;
import javax.validation.Valid;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.dao.ProdutoDao;
import br.com.caelum.vraptor.model.Produto;
import br.com.caelum.vraptor.validator.Validator;

@Controller
public class ProdutoController {

    private final Result result;
    private final ProdutoDao dao;
    private final Validator validator;

    @Inject
    public ProdutoController(Result result, ProdutoDao dao, Validator validator) {
        this.result = result;
        this.dao = dao;
        this.validator = validator;
    }

    public ProdutoController() {
        this(null, null, null);
    }

    public void sobre(){}

    @Get
    public void formulario(){}

    @Get
    public List<Produto> lista(){
        return dao.lista();
    }

    @Post
    public void adiciona(@Valid Produto produto){

        validator.onErrorUsePageOf(this).formulario();

        dao.adiciona(produto);
        result.include("mensagem", "Produto adicionado com sucesso!");
        result.redirectTo(this).lista();

    }

    public void remove(Produto produto){
        dao.remove(produto);
        result.include("mensagem", "Produto removido com sucesso!");
        result.redirectTo(this).lista();
    }

}

ProdutoDao

package br.com.caelum.vraptor.dao;

import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;

import br.com.caelum.vraptor.model.Produto;

public class ProdutoDao {

    private final EntityManager em;

    @Inject
    public ProdutoDao(EntityManager em) {
        this.em = em;
    }

    public ProdutoDao() {
        this(null);
    }

    public void adiciona(Produto produto) {
        em.getTransaction().begin();
        em.persist(produto);
        em.getTransaction().commit();
    }

    public void remove(Produto produto) {
        em.getTransaction().begin();
        em.remove(busca(produto));
        em.getTransaction().commit();
    }

    public Produto busca(Produto produto) {
        return em.find(Produto.class, produto.getId());
    }

    @SuppressWarnings("unchecked")
    public List<Produto> lista() {
        return em.createQuery("select p from Produto p").getResultList();
    }
}

Produto

package br.com.caelum.vraptor.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;


@Entity
public class Produto {

    @GeneratedValue @Id
    private Long id;

    @NotNull(message="{nome.obrigatorio}") 
    @NotEmpty(message="{nome.obrigatorio}") 
    @Size(min=2, message="{nome.quantidade.minima}")
    private String nome;

    @Min(value=0, message="{produto.valor.negativo}")
    private Double valor;

    @Min(value=0, message="{produto.quantidade.negativa}")
    private Integer quantidade;

    public Produto() {
    }

    public Produto(String nome, Double valor, Integer quantidade) {
        this.nome = nome;
        this.valor = valor;
        this.quantidade = quantidade;
    }

    public Long getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Double getValor() {
        return valor;
    }

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

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

}
2 respostas
solução!

O atributo name do seu forme está como name="${produto.nome }". Sendo que o correto seria name="produto.nome". Talvez vc tenha confundido com o atributo value ;)

André,

Você tem razão, inverti os campos... Obrigada!