1
resposta

inserir um produto e uma categoria

Olá! estou tentando inserir um produto no banco de dados, mas estou tendo um problema para pegar a categoria. Obs: embora o meu select carregue a lista de categorias, quando verifico o controller a categoria vem null. recebo esse erro : org.apache.jasper.JasperException: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'categoria' available as request attribute

Classe ProdutoController

public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDAO;

    @Autowired
    private CategoriaDao categoriaDAO;

    @RequestMapping("produtos/form")
    public ModelAndView form() {

        List<Categoria> categoria = categoriaDAO.listaTodos();

        ModelAndView modelAndView = new ModelAndView("produtos/form"); //acrescentar categoria
        modelAndView.addObject("categorias", categoria);
        return modelAndView;
//        return "produtos/form";
    }

    @RequestMapping(value = "/produtos", method = RequestMethod.POST)
    public String grava(@ModelAttribute("produto") Produto produto) {

            System.out.println(produto);
            System.out.println(produto.getCategoria());
            Categoria categoriaForm = categoriaDAO.buscaPorId(produto.getCategoria().getId());
            produto.setCategoria(categoriaForm);
            produtoDAO.adiciona(produto);
            return "produtos/ok";

    }

JSP

<form action="/teste/produtos" method="POST" modelAttribute="produto">
        <div>
            <label>Nome do Produto</label>
            <input type="text" name="nome">
        </div>
        <div>
            <label>Descrição</label>
            <textarea rows="10" cols="20" 
                    name="descricao"></textarea>
        </div>
        <div>
        <label>Categoria</label> 
        <form:select   path="categoria.id">
            <form:option  value="NONE"> --SELECT--</form:option >
            <form:options items="${categorias}" itemValue="id" itemLabel="nome"></form:options>
        </form:select  >

        </div>    
        <div>
            <label>Valor</label>
            <input type="text" name="valor">
        </div>    

        <button type="submit">Cadastrar</button>
    </form>

** Produto Model **

@Entity
@Table(name = "PRODUTO")
public class Produto {


    @Id
    @Column(name = "ID_PRODUTO")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    private String nome;
    private String descricao;
    private BigDecimal valor;

    @ManyToOne
    @JoinColumn(name = "ID_CATEGORIA")
    private Categoria categoria;

//getters e setters omitidos

** Categoria Model **

@Entity
@Table(name = "CATEGORIA")
public class Categoria {

    @Id
    @Column(name = "ID_CATEGORIA")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String nome;

    @OneToMany(targetEntity=Produto.class, mappedBy="categoria", fetch=FetchType.EAGER)
    private List<Produto> produtos;

    public Integer getId() {
        return id;
    }

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

    @OneToMany(mappedBy = "categoria", cascade = CascadeType.ALL)
    public List<Produto> getProdutos() {
        return produtos;
    }

//getters e setters omitidos
1 resposta

Opa Hayra, tudo certo?

Peço desculpas pela demora no retorno a sua mensagem.

Esse erro geralmente ocorre quando você está usando a tag <form> do Spring e não definiu o objeto de ligação (binding object) ou o objeto de destino (target object) corretamente. Uma solução para o cenário que você apresentou é verificar se você definiu o objeto de destino corretamente em seu controlador.

Todavia, vale ressaltar que como você postou sua pergunta há algum tempo é possível que a constante evolução da tecnologia impacte na resolução da sua dúvida. Sendo assim, caso queira se aprofundar neste tema e com conteúdos atualizados, recomendo os materiais abaixo:

Espero ter ajudado.

Abraços e bons estudos!