2011-02-25 20 views
5

Bir POST gövdesine erişmeye çalışıyorum ve yöntemimin bir nesneye bağlanmasını istediğiniz parametreleri istiyorum.@RequestBody ve @ModelAttribute birlikte mi kullanıyorsunuz?

Bu mümkün mü?

Bulunduğum beyan şimdiye isabet almaz: Bu durum alıyorum gibi

@RequestMapping(method = RequestMethod.POST) 
public void doStuff(@RequestBody byte[] bodyData, @ModelAttribute Form form, Model model) { 

görünüyor: düzgün çalışması için Bunun için

- 2011-02-25 16:57:30,354 - ERROR - http-8080-3 - org.springframework.web.portle 
t.DispatcherPortlet - Could not complete request 
java.lang.UnsupportedOperationException: @RequestBody not supported 
+0

@Controller ve @RequestMapping ek notlarınızı yerinde var mı? – GriffeyDog

+0

POST gövdesini @RequestBody değişkenine ve @ModelAttribute değişkenindeki GET parametrelerini almaya çalıştığınız mı? –

+0

@three_cups_of_java: Evet. –

cevap

6

, sen 'Emin olmak zorunda AnnotationMethodHandlerAdapter'u yeniden kullanıyor. Bu, HandlerMethodInvoker'screateHttpInputMessage'u geçersiz kılar (bu, gördüğünüz istisnayı atar). Sana

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> 

UYARI senin * -servlet.xml içinde şunlardır sadece inanıyorum

(., Özel bir sınıfta yapar): Aşağıdaki cevap @RequestBody ihtiyacı durumunda içindir ve Aynı işleyici yönteminde @RequestParam. Bu soruya cevap vermez, ancak birisine kullanım olabilir.

Bunu, Spring 3.0.1 kullanarak test ettim. Bu mümkün, ama bu biraz riskli. @RequestParam argümanınızdan önce @RequestBody metodunuzun argümanını almalısınız. Tahmin ediyorum, çünkü bu parametre HandlerMethodInvoker parametresi alınırken istek gövdesini (GET parametreleri ile birlikte) okur (ve istek gövdesi sadece bir kez okunabilir).

@RequestMapping(value = "/test", method = RequestMethod.POST) 
public String test(
     @RequestBody String body, 
     @RequestParam("param1") String parma1, 
     Map<Object, Object> model: Map[AnyRef, AnyRef]) 
{ 
    model.put("test", test) 
    model.put("body", body) 

    return "Layout" 
} 

alternatif @PathVariable kullanmaktır: (Scala ben kod, bu yüzden bu Java kodu derlenmiş ettik UYARI)

İşte bir örnek. Bunun işe yaradığını doğruladım.

+1

Bunu okurken yarı benekler eklemediğimi fark ettim. Scala'da yazmamayı ne kadar çok sevdiğimi göstermek için bunu değiştirmeyeceğim :) –

+0

Bahse girerim bu tanımımı yapılandırmamda yok. Bunu onaylamak için daha sonra test edeceğim. Kodumun iyi bir kısmı için Groovy kullanıyorum, bu yüzden de yarı-noktalı virgülün bir hayranıyım: P. Java'da değil Scala'da nasıl çalışabileceğini görmüyorum. –

1

Ne yazık ki bu imkansız. Spring MVC'nin portlet versiyonunu kullanıyorsanız (ve günlüklerden hoşlanıyorsa), this JIRA issue ile ilgilenebilirsiniz.

AnnotationMethodHandlerAdapter, PortletHandlerMethodInvoker'ı dahili olarak kullanır ve ikincisi ise HandlerMethodInvoker öğesinin iç alt sınıfıdır - HttpMessageConverter-s'yi yapılandırabileceğiniz yerdir. Ama null olarak ayarlanmışlar. Ve mülk son. Hatta HandlerMethodInvoker yerine olabilir geçici çözüm için olurdu ama o

yapamazsın .. o en yapıcı oluşturulan;) fark

Bir şey Spring MVC Servlet sürümü tamamen HttpMessageConverter-ler destekler ve yapmasıdır bu sorundan çekilmiyor.

İlgili konular