2011-10-26 27 views
6

Estoy intentando eliminar una entidad en una página mediante un enlace de eliminación (a href) o un botón de eliminación (formulario). Estoy usando el botón eliminar desde un enlace llama a un "hacerse" en lugar de un "POST"programación del controlador Spring MVC y jsp para HttpDelete

Este es el código JSP, que tiene la intención de hacer eso:

<td><form:form method="DELETE" action="/client/invoices/${invoice.id}"><input type="submit" value="delete"></form:form></td> 

el código HTML resultante es la siguiente:

<td><form id="command" action="/client/invoices/9" method="post"><input type="hidden" name="_method" value="DELETE"/><input type="submit" value="delete"></form></td> 

Así que estoy bastante contento. Tiene _method que indica que es una acción DELETE. Aquí está mi código de controlador:

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) 
public String delete(@PathVariable("id") Long id, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, Model uiModel) { 
     invoiceServiceHibernate.removeInvoice(id); 
     return "redirect:/invoices"; 
} 

Entonces, lo que sucede es que este método no se llama. Tengo otro método que hace una POST para crear una factura y, al hacer clic en el botón Eliminar, se crea una factura. Supongo que el controlador mira el servlet como una solicitud POST y utiliza el primer método que maneja una solicitud POST que en este caso es crear una nueva factura.

Intento hacer esto "RESTful" así que quiero que sea /invoice/id y usar POST, PUT, DELETE, GET pero no estoy seguro de cómo codificar eso en el controlador usando Spring MVC.

soy capaz de conseguir que esto funcione añadiendo "verbos", como /invoices/id/delete y configurar el controlador como

@RequestMapping(value = "/{id}/delete", method = RequestMethod.POST) 

Nota, la RequestMethod.POST pero dado que los valores de mapa tienen explícitamente /id/delete, lo hace no use la POST predeterminada que está mapeada a /invoices y /invoices/id.

Espero que esté claro. Si alguien tiene alguna sugerencia o código de muestra (fuertemente preferido), lo agradecería. He leído estos SO enlaces de referencias: Link1 Link2 Link3

+0

Am frente al mismo problema. También he agregado el filtro. Pero hasta que el método de eliminación se convirtió en POST. ¿Puedes ayudarnos? – shalu

Respuesta

7

¿Te ha establecido la HiddenHttpMethodFilter en su web.xml? Ese filtro convierte los parámetros del método publicado en métodos HTTP y permite la compatibilidad para la conversión de métodos en las etiquetas de formulario Spring MVC.

<filter> 
    <filter-name>hiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>hiddenHttpMethodFilter</filter-name> 
    <servlet-name>servletName</servlet-name> 
</filter-mapping> 
+0

Estoy enfrentando el mismo problema. También he agregado el filtro. Pero hasta que el método de eliminación se convirtió en POST. Puedes ayudar – shalu

2

Aquí es el equivalente en Java Config (requiere Servlet API 3.0+)

servletContext 
     .addFilter("HiddenHttpMethodFilter", HiddenHttpMethodFilter.class) 
     .addMappingForUrlPatterns(null, false, "<your desired mapping here>"); 
Cuestiones relacionadas