Cliente Jersey + HTTP DELETE

2 respostas
erico_kl

Olá pessoal

Estou iniciando uns estudos com o Jersey para colocar em prática a arquitetura REST. Estive fazendo uns testes e achei bem interessante principalmente a forma com que o Jersey deixa transparente o mapeamento dos JSONs para objeto e a simplicidade na implementação dos recursos. Porém tenho um problema ao invocar um DELETE no servidor:

fui atrás do erro e vi que muita gente recorria à mesma solução: fazer uma chamada assíncrona do cliente usando AsyncWebResource… porém fazendo essa chamada o cliente não invoca o método… Pesquisei mais a fundo e vi que em alguns casos ao invés do retorno void era chamado o método @DELETE retornando um Response… também não adiantou. Segue como tenho hoje:

@DELETE @Consumes(MediaType.APPLICATION_JSON) public void remove(Cliente cliente) { //... remoçao do cliente.. }
Cliente:

Cliente cliente = new Cliente(...); WebResource wr = c.resource(SERVER).path("cliente"); wr.delete(cliente);
Testei de várias formas (retornando Response, passando o id do cliente via @PathParam) mas todas as formas ou retorna o erro informado anteriormente, ou o response retorna como “Method not allowed” ou a chamada assíncrona não realiza o invoke…

Alguma ideia?

2 Respostas

erico_kl

Fazendo mais uns testes aqui consegui invocar o DELETE através do @PathParam passando o código, mas o que preciso é invocar o delete passando um Cliente (via JSON)…

erico_kl
realizando mais alguns testes vi que o problema é na forma com que o cliente invoca, pois testei com o curl e funcionou perfeitamente
curl -i -X DELETE -H 'Content-Type: application/json' -d '{"codigo":"2","idade":"23","nome":"João da Silva","salario":"1900"}' http://localhost:8080/jersey_test/rest/cliente
Resultado:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Fri, 12 Oct 2012 04:12:04 GMT
Mas quando acesso pelo cliente jersey desta forma:
WebResource wr = client.resource(SERVER).path("cliente");
wr.delete(ClientResponse.class, cliente);
Ocorre aquele erro que citei no primeiro post..
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
 - with linked exception:
[java.net.ProtocolException: HTTP method DELETE doesn't support output]
	at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)
	at com.sun.jersey.api.client.Client.handle(Client.java:648)
	at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
	at com.sun.jersey.api.client.WebResource.delete(WebResource.java:282)
	at client.ClienteRuntime.delete(ClienteRuntime.java:80)
	at client.ClienteRuntime.main(ClienteRuntime.java:42)
Caused by: javax.ws.rs.WebApplicationException: javax.xml.bind.MarshalException
 - with linked exception:
[java.net.ProtocolException: HTTP method DELETE doesn't support output]
	at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.writeTo(AbstractRootElementProvider.java:159)
	at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:300)
	at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:213)
	at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
	... 5 more
E quando faço a chamada assíncrona:
AsyncWebResource wr = client.asyncResource(SERVER).path("cliente");
wr.delete(ClientResponse.class, cliente);
nada acontece.. no servido o método não é chamado, e no cliente nenhum erro é lançado..

O que pode estar errado?

Obrigado pela ajuda, desde já

Criado 8 de outubro de 2012
Ultima resposta 11 de out. de 2012
Respostas 2
Participantes 1