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

Problema ao remover produtos

Durante o curso foi implementado o recurso para remover produtos da lista, então no momento funcionou muito bem. Depois que foi modificado a forma de manipulação do dao não consigo mais remover produtos da lista. está apresentando o seguinte erro:

HTTP Status 405 -

type Status report

message

description The specified HTTP method is not allowed for the requested resource.

Apache Tomcat/8.0.28

{Console}

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)

{ProdutoController}

package br.com.caelum.vraptor.controller;

import java.util.List;

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

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.dao.ProdutoDao;
import br.com.caelum.vraptor.util.JPAUtil;
import br.com.caelum.vraptor.validator.Validator;
import br.com.caelum.vraptor.view.Results;
import br.com.caelum.vraptor.model.Produto;

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

    @Get("/")
    public void inicio() {

    }
    @Get
    public void lista(){
        result.include("produtoList", dao.lista());
    }

    @Get
    public void listaXML(){
        result.use(Results.xml()).from(dao.lista()).serialize();
    }

    @Get
    public void listaJSON(){
        result.use(Results.json()).from(dao.lista()).serialize();
    }

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

        validator.onErrorForwardTo(this).formulario();

        dao.adiciona(produto);
        result.include("mensagem","Produto Adicionado com Sucesso");
        result.redirectTo(this).lista();
    }

    @Get
    public void sobre() {

    }
    @Get
    public void formulario() {
    }

    @Post
    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.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;

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

@RequestScoped
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.persist(produto);
    }

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

    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();
    }
}
2 respostas
solução!

Oi João, tudo bem?

O status do http 405 indica que você está tentando obter um recurso através de um método não suportado pelo servidor. No caso o seu método remove está com a anotação @Post suportando apenas o método http Post durante as requisições. Provavelmente você está mandando via get, com os parâmetros através da url do navagador.

Uma opção é alterar a anotação do método remove() para @Get, vê se fazendo isso funciona?

Faz sentido? Abraço.

Perfeito. funcionou blz. muito obrigado pela ajuda.