@Delete + VRaptor4 + Ajax

4 respostas Resolvido
java
mahenrique94

Fala ai galera, estou precisando fazer um botão deletar nas minhas displaytags, porém esta retornando erro 405 de não permitido, não estou conseguindo fazer a requisição ajax bater no meu método @Delete.

Segue método:

@Delete("")
public void deletar(T obj) {
	this.getDao().delete(obj);
	if(this.isRedirect())
		this.result.redirectTo(this).listar(obj, null);
}

Função para deletar:

function deletar(obj){
	var url = obj.href || obj.formAction;
	if (confirm("Deseja confirmar a exlusão ?")) {
		$.ajax({
			url: url + '?_method=DELETE',
			type: 'POST',
			success: function(data) {
				var td = jQuery(obj).parent();
		    	        jQuery(td).parent().remove();
			},
			error: function() {
				alert('Não foi possível realizar a exclusão');
			}
		});
	}
	return false;
};

Chamada da função no HTML:

<button class="btn-der btn-xs" formaction="<c:url value="/produto-servico/classe/${obj.id}"/>" onclick="deletar(this);" type="button"><span class="icon-trash"></span>&nbsp;<fmt:message key="button.deletar"/></button>

Se alguém puder me ajudar ficaria muito grato.

4 Respostas

aix

Ola @mahenrique94,

retira o delete do final da url e passa no data, ex:

data: {_method : "DELETE"}

la no Vraptor envia o id para o @delete, ex:

@Delete("/seuRecurso/remove/{objeto.objId}")
public void remove(Object obj) {
        suaService.delete(obj);
        result.nothing();
    }

depois faz merge no repositório.

mahenrique94

Ola @alx

Já havia feito da maneira como você solicitou:

function deletar(obj){
	var url = obj.href || obj.formAction;
	if (confirm("Deseja confirmar a exlusão ?")) {
		$.ajax({
			url: url,
			type: 'POST',
                        data: {_method: 'DELETE'},
			success: function(data) {
				var td = jQuery(obj).parent();
		    	        jQuery(td).parent().remove();
			},
			error: function() {
				alert('Não foi possível realizar a exclusão');
			}
		});
	}
	return false;
};

Porém permanecia o erro 405, e referente ao método não posso passar o id no path do mesmo pois é um controller genérico então não sei se o objeto que esta vindo terá o id, mas eu ja passo o id do objeto no formaction do button, meu método delete ja se vira para achar a chave primária e apagar:

@Override
public void delete(T obj) {
	// TODO Auto-generated method stub
	this.em.remove(this.em.getReference(obj.getClass(), this.em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(obj)));
}

Se eu trocar o @Delete para @Get ou @Post o mesma funciona, porém eu quero usar @Delete por questões de segurança, esse código js funciona perfeitamente com @Delete + VRaptor 3.

aix

Parece estar certo brother se você ja envia o objeto esta certo, mas o @Delete no meu ver que tem quer o recurso mapeado para onde seu form action esta enviando, vou ver se logo mais tarde no meu PC de casa que é onde uso o Vraptor e ver como eu faço pois la eu uso direto @Delete, @Put e fucniona bem, depois volto aqui para postar caso ainda não tenha conseguido, abração t+.

mahenrique94
Solucao aceita

Problema resolvido, estava passando a url errada do formaction do button.

Estava

formaction="<c:url value="/produto-servico/grupo/${obj.id}"/>"

Com essa url estava batendo no método editar que só aceite @Get onde eu estava mandando @Delete então troquei a url para:

formaction="<c:url value="/produto-servico/grupo?obj.id=${obj.id}"/>"

Ai o problema foi resolvido

Criado 30 de junho de 2016
Ultima resposta 1 de jul. de 2016
Respostas 4
Participantes 2