2013-05-08 7 views
8

Neden bir jQuery.ajax çağrısından bir istek alamıyorum anlamaya çalışıyorum o zaman Bahar @Controller eylemci yöntemi bir @RequestBody ek açıklama içerir. Aşağıdaki düşünün:Spring @MVC ve @RequestBody ek açıklamaları x-www-form-urlencoded verilerle mi?

HTML/JavaScript:

<form id="foo" action="/baz"> 
    <input name="bar"> 
</form> 

<script> 
    $(function() { 
    var $fooForm = $('#foo'); 

    $fooForm.on('submit', function(evt) { 
     evt.preventDefault(); 

     $.ajax({ 
     url: $fooForm.action, 
     data: $fooForm.serialize(), 
     dataType: 'json', 
     type: 'POST', 
     success: function(data) { console.log(data); } 
     }); 
    }); 
    }); 
</script> 

Java:

@RequestMapping(
    value = "/baz", 
    method = RequestMethod.POST, 
    consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
    produces = MediatType.APPLICATION_JSON_VALUE 
) 
public @ResponseBody SearchResults[] jqueryPostHandler(
    @RequestBody FormDataObject formData) 
{ 
    return this.searchService.find(formData); 
} 

üzerinde 415 hata @RequestBody açıklama mevcut başarısız ve dönecektir (istisna olacak üretilecek). Ancak, @RequestBody ek açıklaması kaldırılırsa (yani, parametre imzası yalnızca FormDataObject formData), yöntem çağrılır ve JSON JavaScript'e döndürülür.

Bu neden böyle? Bir POST isteği, isteğin gövdesindeki verileri içerir. Ek açıklama süreci böyle bir istek değil mi?

Ek açıklama yapmak için JavaScript tarafından gönderilen içerik türünü application/json ve consumes özelliğini MediaType.APPLICATION_JSON_VALUE olarak değiştirebileceğimi anlıyorum. Ama neden normal form talebi ile çalışmıyor?

Not Not: Spring 3.1.4 kullanıyorum.

+0

http://matthewsalvatore.blogspot.com.br/2013

Sonra aşağıdakileri deneyin /08/spring-framework-working-with-x-www.html – Allenaz

cevap

7

"org.springframework.web" adresinde günlüğe döndürülen durum kodu nedenini öğrenmek için oturum açmayı denediniz mi? 415.

Çevrilmeden önce bir istisna oluşturulmalı ve günlüğe kaydedilmelidir. Ayrıca form verisi gönderiliyorsa, neden sadece @RequestBody'yi dışarıda bırakmayın. Daha sonra, nesne alanlarına Servlet istek parametrelerini uygulayacak veri bağlama (yani, @ModelAttribute) kullanacaksınız. Bu, FormHttpMessageConverter kullanıldığında tercih edilir.

+0

Günlüğe kaydetme, '@ RequestBody' ek açıklamasında, _does_ haritasının doğru yöntem, ancak "org.springframework.web.HttpMediaTypeNotSupportedException: İçerik türü 'uygulama/x-www-form-urlencoded; charset = UTF-8' desteklenmez". –

+0

Sınırlı anlayışım gereği, '@ RequestBody 'açıklaması, işlenecek verilerin isteğin gövdesinde olacağını ima eder. Bu, derleyiciyi _and_ kodunu okuyan kişiye bildirir. Yani, bırakarak belirsiz kodlar yapar. Bu yüzden neden başarısız olduğunu bilmek istiyorum. –

6

Spring Docs of @RequestBody belirtildiği gibi, istek gövdesi HttpMessageConverter tarafından nesnesine dönüştürülecektir.

o FormHttpMessageConverter işidir, ajax.serialize() oluşturmaktır url kodlanmış formu, dönüştürmek için. HttpMediaTypeNotSupportedException istisnası olduğundan, FormHttpMessageConverter'u yapılandırmamışsınızdır. bahar yapılandırma dosyasını kontrol edin, burada bir örnek:

< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    < property name= "messageConverters" > 
     < list> 
      < ref bean= "mappingJacksonHttpMessageConverter" /> 
      < ref bean= "stringHttpMessageConverter" /> 
      <!-- Do you have this converter ? --> 
      < ref bean= "formHttpMessageConverter" /> 
     </ list> 
    </ property> 
</ bean> 
+0

Tüm dönüştürücülerimi ekleseydim bile, yukarıdakiler benim için çalışmadı. Çalıştırmak için http://stackoverflow.com/a/31083802/471213 adresindeki özel dönüştürücüyü kullanmam gerekiyordu –

+0

@ usr-local-ΕΨΗΕΛΩΝ sorununuz bu soruyla aynı mı? Cevabım bu soru için, ve eğer sizinki farklıysa, ya da belki daha fazla ayrıntıyı açıklamak için yeni bir soru sormalısınız. – Qianyue

+0

Aynı sorun değil: JSON gönderirken form ve başarı gönderirken 406 hatam var. Ancak, ilkbahardan kodla hata ayıklamadan önce, "FormHttpMessageConverter" ile çalışabilmesi için istek öğesinin ** "bir" MultiValueMap "uygulaması gerektiğini anlamıştım. Yani * şimdi * OP'nin '' FormDataObject''ün bu arayüzü uyguladığı ya da OP’le aynı problemi yaşadığımı düşünmeye başladım ama bu dönüştürücünün işe yaramayacağını düşünüyorum. Ve bu arada Spring 4.2 kullanıyorum –

-2

Sorun, application/x-www-form-urlencoded kullandığınızda, Bahar bir RequestBody olarak bunu anlamak olmamasıdır.Bu 'u kullanmak istiyorsak, @RequestBody ek açıklamasını kaldırmamız gerekir. Ek açıklama @RequestBody

cevap kaldırıldı

@RequestMapping(
     value = "/baz", 
     method = RequestMethod.POST, 
     consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
     produces = MediatType.APPLICATION_JSON_VALUE 
) 
public @ResponseBody SearchResults[] jqueryPostHandler(
     FormDataObject formData) 
{ 
    return this.searchService.find(formData); 
} 

Not: Http Post request with content type application/x-www-form-urlencoded not working in Spring

+1

OP zaten bunu belirtmiştir. Onun nedeni budur. –

İlgili konular