2011-05-05 19 views
17

Quizás se supone que esto no funciona, pero al menos me gustaría entender por qué. Estoy pasando un val simple = algún valor en el cuerpo PUT pero el resorte devuelve un 400 Bad Request ya que no parece reconocer el parámetro val.SpringMVC no reconoce los parámetros del cuerpo de solicitud si usa PUT

La solicitud similar funciona con POST. ¿Podría ser SpringMVC que no reconoce el cuerpo de la solicitud PUT como fuente para los parámetros?

Content=-Type está configurado correctamente para application/x-www-form-urlencoded en ambos casos.

El método que la primavera se niega a llamar es el siguiente:

@RequestMapping(value = "config/{key}", method = RequestMethod.PUT) 
@ResponseBody 
public void configUpdateCreate(final Model model, @PathVariable final String key, @RequestParam final String val, 
     final HttpServletResponse response) throws IOException 
{ 
    //... 
} 

Para completar, aquí es la llamada jQuery Ajax. No puedo ver nada malo con eso. El cliente es Firefox 4 o Chrome, ambos muestran el mismo resultado.

$.ajax({ 
     url:url, 
     type:'PUT', 
     data:'val=' + encodeURIComponent(configValue), 
     success: function(data) {...} 
     });  

¿Alguna idea?

+0

¿funciona cuando lo cambia a POST? –

+0

¿Por qué anota el método con @ResponseBody en un método nulo? Se supone que esa anotación indica que el tipo de devolución debe escribirse directamente en el cuerpo de respuesta HTTP. Creo que este no es el caso. También podría intentar hacer esto: data: {'val', encodeURIComponent (configValue)}, – Javi

+0

¿Cuál es el mensaje de error que aparece con el código 400? – skaffman

Respuesta

19

No sé de un trabajo en torno a este punto, pero aquí es el informe de error que es un "no Fijar." He estado luchando la misma edición

https://jira.springsource.org/browse/SPR-7414

Actualización: Aquí está mi solución. Estoy usando la anotación RequestBody. Luego usando MultiValueMap.

http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/mvc.html#mvc-ann-requestbody

@RequestMapping(value = "/{tc}", method = RequestMethod.PUT) 
public void update(@PathVariable("tc") final String tc, 
@RequestBody MultiValueMap<String,String> body, HttpServletResponse response) { 

    String name = body.getFirst("name"); 
// more code 
} 
+1

También vea: http://markmail.org/thread/bqb44tqnhmvtlji6 –

+0

Gracias por el enlace a la discusión en la lista Tomcat, aclara el problema. En mi caso, la solución con la anotación @RequestBody no funcionaba con una clase de modelo/form-backing-bean personalizada, en lugar de una multimap. Así que estoy usando HiddenHttpMethodFilter y estoy enviando una solicitud POST de jQuery que incluye un _method = put param, como sugirió php-coder. – meyertee

1

que no tienen solución adecuada para usted, pero en su caso Trato siguiente:

  • página Crear con form:form method="PUT"
  • declaran HiddenHttpMethodFilter en web.xml

si esto funciona, luego

  • cambio type de PUT a POST en la llamada ajax
  • complementos necesarios params qué cliente tiene con form:form etiqueta (algo así como _method)

En otras palabras, según entiendo primavera emula PUT basado en simples POST con el parámetro especial. Solo envíale lo que él quiere.

Consulte también: http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/ y ejemplos de código relacionados ahí: http://code.google.com/p/spring-finance-manager/source/browse

HTH

1

Esto, como se sugiere más arriba, parece que hay un error en spring/servlet API. En realidad, se supone que las solicitudes PUT funcionan en Request Body (or payload) y no en Parámetros de solicitud. En ese sentido, el manejo del resorte de servlet API & es correcto.

Habiendo dicho eso, una solución mejor y mucho más fácil es pasar ningún elemento de datos de su javascript/jQuery llamada y pasar sus parámetros como parte de la url misma. es decir, establecer los parámetros en el campo url de la manera que lo haría en una llamada GET.

$.ajax({ 
      url: "yoururl" + "?param1=param2Val&..", 
      type: "PUT", 
      data: "", 
      success: function(response) { 
       // .... 
      } 
    }); 

ahora esto funciona para los parámetros simples, supongo, no funcionará para los tipos complejos de JSON. Espero que esto ayude.

12

Since Primavera 3.1, esto se resuelve con org.springframework.web.filter.HttpPutFormContentFilter.

<filter> 
    <filter-name>httpPutFormContentFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>httpPutFormContentFilter</filter-name> 
    <servlet-name>rest</servlet-name> 
</filter-mapping> 
+1

¡Eres mi héroe! –

+0

esto irá a su web.xml – tibi

Cuestiones relacionadas