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

DELETE não funcionando!

Fiz um exemplo próprio, com uma lista de fornecedores. No entanto, o DELETE parece não funcionar, pois utilizo o comando DELETE pelo curl, e quando retorno a lista de fornecedores pelo curl http://localhost:8080/fornecedores, ele ainda se encontra lá:

public class Fornecedor {
    private long id;
    private String nome;
    private String email;
    private String comment;
    private String cnpj;

    public Fornecedor criaFornecedor(long id, String nome, String email, String comment, String cnpj) {
        this.id = id;
        this.nome = nome;
        this.email = email;
        this.comment = comment;
        this.cnpj = cnpj;
        return this;
    }

    public String toXML(){
        return new XStream().toXML(this);
    }

    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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }
}
public class FornecedorDAO {

    private static List<Fornecedor> bancoMemoria = new ArrayList<Fornecedor>();
    private static AtomicLong counter = new AtomicLong(1);

    static {
        Fornecedor fornecedor = new Fornecedor().criaFornecedor(1l, "Neomind", "vendas@neomind.com.br", 
                "Soluções voltadas a gestão de processos, documentos e indicadores para organizações.", "08.032.121/0001-27");

        bancoMemoria.add(fornecedor);
    }

    public static List<Fornecedor> getBancoMemoria() {
        return bancoMemoria;
    }

    public String toXML(){
        return new XStream().toXML(FornecedorDAO.getBancoMemoria());
    }

    public Fornecedor buscaFornecedorNoBanco(Long id) {
        for (Fornecedor fornecedor : bancoMemoria) {
            if(fornecedor.getId() == id){
                return fornecedor;
            }
        }
        return null;
    }

    public void adicionaFornecedorAoBanco(Fornecedor fornecedor) {
        long id = counter.incrementAndGet();
        fornecedor.setId(id);
        bancoMemoria.add(fornecedor);
    }

    public void removeFornecedorDoBanco(int id) {
        for (Fornecedor fornecedor : bancoMemoria) {
            if(fornecedor.getId() == id){
                bancoMemoria.remove(id);
            }
        }
    }
}
@Path("fornecedores")
public class FornecedorResource {

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public String busca() {
        FornecedorDAO fornecedores = new FornecedorDAO();
        return fornecedores.toXML();
    }

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public Response adiciona(String conteudo) {
        Fornecedor fornecedor = (Fornecedor) new XStream().fromXML(conteudo);
        new FornecedorDAO().adicionaFornecedorAoBanco(fornecedor);
        URI uri = URI.create("/fornecedores");
        return Response.created(uri).build();
    }

    @Path("{id}")
    @DELETE
    public Response removeProduto(@PathParam("id") int id) {
        new FornecedorDAO().removeFornecedorDoBanco(id);
        return Response.ok().build();
    }
}
13 respostas

Pode mostrar como voce esta chamando a URL de delete?

Olá Rafael! Se refere pelo CURL? Estou chamando pela linha de comando: curl -v -X DELETE http://localhost:8080/fornecedores/1, e recebo a saída:

*   Trying ::1...
* TCP_NODELAY set
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> DELETE /fornecedores/1 HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.1
> Accept: */*
>
< HTTP/1.1 500 Index: 1, Size: 1
< Date: Tue, 25 Jul 2017 17:29:29 GMT
< Connection: close
< Content-Length: 0
<
* Closing connection 0

Como visto, recebo o código 500 de erro, mas não sei o motivo...

Aparentemente esta correto, voce ja tentou chamar via Postman? Ele pode mostrar o erro, se possuir.

Ele até demonstra o erro (500), mas não entendo o motivo.

Erro 500, então e interno.

Verifica se o meu metodo que o DELTE chama, coloca um tipo de sysout la dentro pra ve se esta chegando nele.

Coloquei no método e deu certo!

@Path("{id}")
    @DELETE
    public Response removeFornecedor(@PathParam("id") int id) {
        System.out.println("Chamou DELETE!");
        new FornecedorDAO().removeFornecedorDoBanco(id);
        return Response.ok().build();
    }

Blz, então ele esta chegando nele.

Faça o seguinte:

Tenta dar um sysout no parametro ID, pra ver se o ID esta chegando.

Mesma coisa, fiz com System.out.println("Chamou DELETE! - " + id); e a saída foi Chamou DELETE! - 1... arrancando os cabelos já.. heheheh

Agora fiz assim no método de remover fornecedor:

public void removeFornecedorDoBanco(int id) {
        System.out.println("entrou no método");
        for (Fornecedor fornecedor : bancoMemoria) {
            System.out.println("entrou no for para procurar o ID");
            if(fornecedor.getId() == id){
                System.out.println("entrou no if!");
                bancoMemoria.remove(id);
            }
        }
    }

E ele entrou em todos, inclusive no IF final!

solução!

Então o problema deve estar aqui:

new FornecedorDAO().removeFornecedorDoBanco(id);
        return Response.ok().build();

Ja tentou chamar esse removeFornecedorDoBanco em outro lugar? Em uma classe main por exemplo? Para ver se ela esta funcionando

Cara, FINALMENTE! O erro estava nesse método mesmo, eu estava utilizando um AtomicLong, e, por padrão desta classe, eu não consigo modificar uma coleção com AtomicLong se este se encontra no Loop de qualquer iteração.

Fiz uma "gambiarra" somente para fazer o método funcionar (vou consertar, eu juro hahaha), removendo o objeto FORNECEDOR da lista bancoMemoria fora da iteração:

    public void removeFornecedorDoBanco(int id) {
        boolean x = false;
        Fornecedor f = null;
        for (Fornecedor fornecedor : bancoMemoria) {
            if(fornecedor.getId() == id){
                x = true;
                f = fornecedor;
            }
        }
        if(x==true) bancoMemoria.remove(f);
    }

Então e isso ai, por eliminação você chega no problema.

Muitíssimo obrigado, Rafael! Abraço!