2011-05-05 16 views
17

Może to nie działa, ale przynajmniej chciałbym zrozumieć dlaczego. Podaję prostą wartość val = somevalue w ciele PUT, ale sprężyna odsyła z powrotem 400 Bad Request, ponieważ nie rozpoznaje parametru val.SpringMVC nie rozpoznaje parametrów obiektu żądania, jeśli używasz PUT

Podobna próba działa z POST. Czy może to być SpringMVC nie rozpoznaje ciała żądania PUT jako źródła parametrów?

Content=-Type jest poprawnie ustawiony na application/x-www-form-urlencoded w obu przypadkach.

Metoda że wiosna odmawia nazywają to:

@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 
{ 
    //... 
} 

Dla kompletności, tutaj jest wywołanie jquery ajax. Nie widzę w tym nic złego. Klient to Firefox 4 lub Chrome, oba mają taki sam wynik.

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

Wszelkie pomysły?

+0

czy to działa, gdy zmienisz go na POST? –

+0

Dlaczego przypisuje się do metody metodę @ResponseBody w metodzie void? Ta adnotacja powinna wskazywać, że typ zwracany powinien być zapisany bezpośrednio w treści odpowiedzi HTTP. Myślę, że tak nie jest. Możesz spróbować zrobić to również: dane: {'val', encodeURIComponent (configValue)}, – Javi

+0

Co to jest komunikat o błędzie, który wraca z kodem 400? – skaffman

Odpowiedz

19

nie wiem o pracy wokół w tym punkcie, ale tutaj jest raport o błędzie, że to „nie będzie Naprawić." Walczyłem ten sam problem

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

Update: Oto mój dylemat. Używam adnotacji RequestBody. Następnie za pomocą 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

Zobacz także: http://markmail.org/thread/bqb44tqnhmvtlji6 –

+0

Dzięki za link do dyskusji na liście Tomcat, wyjaśniono problem. W moim przypadku rozwiązanie z adnotacją @RequestBody nie działało z niestandardową klasą model/formularz-komponent bean, a nie z multimapą. Używam więc HiddenHttpMethodFilter i wysyłam żądanie POST z jQuery, w tym _method = put param, jak sugerował php-koder. – meyertee

1

nie mam odpowiednie rozwiązanie dla Ciebie, ale w twoim przypadku próbuję następujący:

  • stworzyć stronę z form:form method="PUT"
  • deklarują HiddenHttpMethodFilter w web.xml

Jeśli będzie to prace, następnie

  • zmiana type z PUT do POST w ajax rozmowy
  • ADD potrzebne params których klient ma z form:form tag (coś jak _method)

Innymi słowy, jak rozumiem Wiosna emuluje PUT na podstawie prostego POST ze specjalnego parametru. Po prostu wyślij mu to, czego chce.

Patrz również: przykłady http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/ i pokrewne kod tam: http://code.google.com/p/spring-finance-manager/source/browse

HTH

1

to, jak sugerują powyżej, wydaje się być błąd w spring/servlet API. W rzeczywistości żądania PUT powinny działać na Request Body (or payload), a nie na Żądanie parametrów. W tym sensie obsługa wiosna serwletu API & jest poprawna.

Powiedziawszy to, lepszym i łatwiejszym obejściem jest pominięcie elementu danych z połączenia javascript/jQuery i przekazanie parametrów w ramach samego adresu URL. co oznacza, ustaw parametry w polu adresu URL w taki sam sposób, jak w przypadku wywołania GET.

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

teraz to działa dla prostych parametrów, jak sądzę, nie będzie działać dla złożonych typów JSON. Mam nadzieję że to pomoże.

12

Since Sprężyna 3.1, rozwiązuje się ją, używając 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

Jesteś moim bohaterem! –

+0

to przejdzie do twojego web.xml – tibi

Powiązane problemy