[RESOLVIDO] VRaptor3 - @Delete e @Put do Controller com _method no submit da view

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 :slight_smile:
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.