Saudações amigos!
Seguindo a orientação do site do VRaptor http://vraptor.caelum.com.br/pt/docs/resources-rest-pt implementei os métodos remove e update com REST no meu AgendaController:
@Resource
public class AgendaController {
private AgendaDao dao;
private Result result;
public AgendaController(AgendaDao dao, Result result) {
this.dao = dao;
this.result = result;
}
@Put("/agenda")
public void update(final Agenda agenda) {
dao.update(agenda);
result.redirectTo(AgendaController.class).list();
}
@Delete("/agenda")
public void remove(Agenda agenda) {
Agenda a2 = dao.search(agenda.getId());
dao.remove(a2);
result.redirectTo(AgendaController.class).list();
}
}
No list.jsp tenho o botão delete. Quando clico direciona novamente para a listagem sem deletar o registro:
<c:forEach items="${agendaList}" var="agenda" varStatus="id">
<tr bgcolor="#${id.count % 2 == 0 ? 'ddd' : 'fff'}">
<td>
<form action="<c:url value="/agenda"/>" method="post">
<input name="agenda.id" value="${agenda.id}" type="hidden" />
<button type="submit" name="_method" value="DELETE"> Remove </button>
</form>
No meu edit.jsp tenho o botão salvar no formulário (obs. omiti campos para simplificar).
<form id="agendaEditForm" action="<c:url value="/agenda}"/>" method="Post">
<fieldset>
<legend>EDITAR AGENDA</legend>
<table border="0">
<tr>
<td>
<label for="siteDestino">Site Destino</label>
</td>
<td>
<input id="siteDestino" class="required" minlength="20"
type="text" size="60" name="agenda.siteDestino" value="${agenda.siteDestino}"/>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input id="agenda.id" name="agenda.id" value="${agenda.id}" type="hidden" />
<button type="submit" name="_method" value="Put">SALVAR</button>
</td>
</tr>
</table>
</fieldset>
</form>
Segue saida no tomcat para o update do botão salvar:
HTTP Status 404 - /etracking/agenda%7D
type Status report
message /etracking/agenda%7D
description The requested resource (/etracking/agenda%7D) is not available.
Apache Tomcat/7.0.14
Estou batendo cabeça com o REST e ainda não entendi como funciona. :?
Oh falta de atenção!
Resolvi dar uma olhada no DAO e este não estava fazendo o commit;
@Component
public class AgendaDao {
private final Session session;
public AgendaDao() {
this.session = FactorySession.getSession();
}
public void update(Agenda agenda) {
this.session.update(agenda);
}
public void remove(Agenda agenda) {
this.session.delete(agenda);
}
}
Após acrescentar:
this.session.beginTransaction();
tx.commit();
Tudo funcionou
Não fazia sentido o código estar ok e não ter o comportamento esperado…
@Component
public class AgendaDao {
private final Session session;
public AgendaDao() {
this.session = FactorySession.getSession();
}
public void update(Agenda agenda) {
Transaction tx = this.session.beginTransaction();
this.session.update(agenda);
tx.commit();
}
public void remove(Agenda agenda) {
Transaction tx = this.session.beginTransaction();
this.session.delete(agenda);
tx.commit();
}
}
Pra ajudar quem estiver com problemas com REST @Delete e @Put vou postar os trechos relevantes.
No controller:
@Put("/agenda/{agenda.id}")
public void update(final Agenda agenda) {
dao.update(agenda);
result.redirectTo(AgendaController.class).list();
}
@Delete("/agenda/{agenda.id}")
public void remove(final Agenda agenda) {
Agenda agenda2 = dao.search(agenda.getId());
dao.remove(agenda2);
result.redirectTo(AgendaController.class).list();
}
Na lista:
<table border="1" cellspacing="0" padding="2" width="2000">
<thead>
<tr>
<th> Logradouro </th>
<th> Localidade </th>
<th> Solicitante </th>
<th colspan="2"> Ação </th>
</tr>
</thead>
<tbody>
<c:forEach items="${agendaList}" var="agenda" varStatus="id">
<tr bgcolor="#${id.count % 2 == 0 ? 'ddd' : 'fff'}">
</td>
<td>${agenda.logradouro }</td>
<td>${agenda.localidade }</td>
<td>${agenda.solicitante }</td>
<td>
<a href="<c:url value="/agenda/${agenda.id}"/>"> Edit </a>
</td>
<td>
<form action="<c:url value="/agenda/${agenda.id}"/>" method="post">
<input name="agenda.id" value="${agenda.id}" type="hidden" />
<input type="submit" name="_method" value="delete" />
</form>
</tr>
</c:forEach>
</tbody>
</table>
No formulário de edição:
<form id="agendaEditForm" action="<c:url value="/agenda/${agenda.id}"/>" method="Post">
<fieldset>
<legend>EDITAR AGENDA</legend>
<table border="0">
<tr>
<td>
<label for="logradouro">Logradouro</label>
</td>
<td>
<input id="logradouro" class="required" maxlength="60"
type="text" size="60" name="agenda.logradouro" value="${agenda.logradouro}"/>
</td>
</tr>
<tr>
<td>
<label for="localidade">Localidade</label>
</td>
<td>
<input id="localidade" class="required" maxlength="60"
type="text" size="60" name="agenda.localidade" value="${agenda.localidade}"/>
</td>
</tr>
<tr>
<td>
<label for="solicitante">Solicitante</label>
</td>
<td>
<input id="solicitante" class="required" maxlength="25"
type="text" size="60" name="agenda.solicitante" value="${agenda.solicitante}"/>
</td>
</tr>
<tr>
<td></td>
<td>
<input type="hidden" name="_method" value="put" />
<input type="submit" value="Enviar"/>
</td>
</tr>
</table>
</fieldset>
</form>
No DAO:
public void update(Agenda agenda) {
Transaction tx = this.session.beginTransaction();
this.session.update(agenda);
tx.commit();
}
public void remove(Agenda agenda) {
Transaction tx = this.session.beginTransaction();
this.session.delete(agenda);
tx.commit();
}
De toda forma, obrigado a todos, principalmente ao Lucas Cavalcanti que tem prestado grandes contribuições ao fórum.
Estou tentando fazer um projeto pela apostila da caelum o fj28, mas na ora de fazer o up date acaba deletando o que esta no banco , Será tem algo errado nessa linha “Produto produto = (Produto) session.load(Produto.class, 1L);”
Ellyson, mostre um pouco mais do código…
como está o método do controller que faz o update?
Oi Lucas Obrigado pela força, mas
eu consegui resolver
no “hibernate.cfg.xml” no: "update"
eu tinha digitado: create"
quando eu jogava para o banco ele criava só uma linha e quando alterava dava erro, mas agora esta normal.