2012-03-23 16 views
11

Aquí está el código real:Spring MVC métodos de controlador anotada, incapaces de "encontrar" método para la operación DELETE

@RequestMapping(value = "/competitors/{id}", method = RequestMethod.GET) 
public Competitor getCompetitor(@PathVariable("id") long id) 
{ 
    Competitor competitor = competitorService.getCompetitorById(id); 

    if (null == competitor) 
    { 
     EmptyResultDataAccessException e = new EmptyResultDataAccessException(1); 
     logger.log(Level.WARN, e.getMessage()); 
     throw e; 
    } 

    return competitor; 
} 

@RequestMapping(value = "/competitors/{id}", method = RequestMethod.DELETE) 
public String deleteCompetitor(@PathVariable("id") long id) 
{ 
    Competitor competitor = new Competitor(); 
    competitor.setId(id); 
    competitorService.deleteCompetitor(competitor); 

    return "Solid gone!"; 
} 

El envío de una solicitud DELETE a/competidores/200 da como resultado el error:

" estado HTTP 405 - método de petición 'Borrar' no soportado"

La tala de primavera confirma que hay una ruta a este método se puede encontrar:

5559 [tomcat-http--3] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 'dispatcher' processing DELETE request for [/vrsboserver/competitors/200] 5562 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 
- Matching patterns for request [/competitors/200] are [/competitors/{id}] 5565 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 
- Mapping [/competitors/200] to handler '[email protected]' 5565 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.WebContentInterceptor - Looking up cache seconds for [/competitors/200] 5565 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.WebContentInterceptor - Applying default cache seconds to [/competitors/200] 5566 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver 
- Resolving exception from handler [[email protected]]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5567 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver 
- Resolving exception from handler [[email protected]]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5568 [tomcat-http--3] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 
- Resolving exception from handler [[email protected]]: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported 5568 [tomcat-http--3] WARN org.springframework.web.servlet.PageNotFound - Request method 'DELETE' not supported 

¿A cuál mi respuesta es "BUH?".

+0

¿Son todas sus tarros de primavera la misma versión? –

+0

Solo para estar seguro, ¿ha verificado que un GET funciona en el mismo mapeo? – smp7d

+0

GET definitivamente funciona. Maven está recibiendo mis jarras de primavera, usando "$ {org.springframework.version}" como cada campo de versión, por lo que definitivamente todos coinciden. – Archeus

Respuesta

0

Intente cambiarlo a method = RequestMethod.GET y vea si funciona.

+0

Ya existe un método con la firma para GET (ver el código publicado) y funciona. – Archeus

+0

¿Cómo le está diciendo al navegador que haga una solicitud DELETE? ¿Dónde está ese conjunto de encabezado? Como en este enlace: http://www.ibm.com/developerworks/webservices/library/wa-restful/index.html?ca=drs- – duffymo

+0

¿Utiliza method = DELETE en su formulario? Tengo curiosidad, porque honestamente no lo sé. – duffymo

1

El navegador normal solo admite get/post.

primavera resuelto mediante el uso de un parámetro oculto, que le permita, a continuación añadir a su web.xml:

<filter> 
    <filter-name>httpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>httpMethodFilter</filter-name> 
    <servlet-name>springDispatcher</servlet-name> 
</filter-mapping> 
4

Tuve el mismo problema. Lo que ayuda y probablemente no sea la solución final, pero me funciona:

Cambio de anotaciones y parámetros del método deleteCompetitors. Eliminar id (parámetro del método también). Lea el parámetro id de HttpServletRequest.

@RequestMapping(value = "/competitors", method = RequestMethod.DELETE) 
public String deleteCompetitor(HttpServletRequest request) 
{ 
    String idHeader = request.getHeader("id"); 

    Integer id = Integer.valueOf(idHeader).intValue(); 

    Competitor competitor = new Competitor(); 
    competitor.setId(id); 
    competitorService.deleteCompetitor(competitor); 

    return "Solid gone!"; 
} 

El parámetro id se pasa por la cabecera de esta manera (código del cliente - no completa):

DefaultHttpClient httpClient = new DefaultHttpClient(); 

HttpDelete httpDelete = new HttpDelete... 

... 

httpDelete.setHeader("id", "123"); 

... 

httpClient.execute(httpDelete); 

estoy usando el Apache HttpClient.

0

Me encontré con este problema recientemente. Aquí hay un par de mis hallazgos/comentarios:

Me postulo Tomcat 7.0.42 con Spring 3.2.2

El siguiente mensaje se escupió en el registro en todos estos casos. 405 Método no permitido se devuelve al cliente.

org.springframework.web.servlet.PageNotFound - Request method 'DELETE' not supported 
  1. La URL REST que está utilizando es incorrecto. Aunque el punto final no está allí, usted todavía obtiene un 405.
  2. Usted no ha iniciado sesión y no está autorizado para realizar ninguna acción, y mucho menos un DELETE
  3. DELETE en realidad no es compatible porque no hay función con método = RequestMethod.GET
  4. Tomcat está bloqueando operaciones como DELETE, PUT, etc.debido a la de sólo lectura conjunto init-param a la verdadera
  5. El método está presente, se permite eliminar, todo está bien excepto que no fue una excepción de tiempo de ejecución no detectada (por ejemplo Excepción de puntero nulo) en el método

Con la excepción de 3 y 4, el mensaje que se muestra y la respuesta es muy engañoso. Te envía a investigar agujeros de conejo que terminan sin resultado.

lo que terminó siendo mi problema es que tuvimos un método como este:

public void deleteSomething(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") long id, @RequestParam String objectName); 

Cabe esto:

public void deleteSomething(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") long id, @RequestParam("objectName") String objectName); 

ver la diferencia? Es el que falta ("objectName") después de @RequestParam. Se compila y funciona bien en STS, pero cuando se implementa en un servidor tomcat directamente, no funciona.

Gracias a @fmelan por la publicación anterior porque nos ayudó a encontrar este pequeño error tipográfico.

Esto no se ve como si fuera su problema, pero para cualquier otra persona que se ha quedado atascado tratando de averiguar por qué 'BORRAR' no se admite ...

Cuestiones relacionadas