Tôi đang cố gắng tìm ra lý do tại sao tôi không thể nhận được yêu cầu từ cuộc gọi jQuery.ajax khi phương pháp xử lý mùa xuân @Controller
bao gồm chú thích @RequestBody
. Hãy xem xét những điều sau đây:Spring @MVC và chú thích @RequestBody với dữ liệu x-www-form-urlencoded?
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);
}
trên sẽ thất bại với các @RequestBody
chú thích hiện tại và trả về một lỗi 415 (không phải ngoại lệ sẽ được tạo ra). Nhưng nếu chú thích @RequestBody
bị xóa (tức là chữ ký tham số chỉ là FormDataObject formData
) thì phương thức sẽ được gọi và JSON sẽ được trả về JavaScript.
Tại sao lại xảy ra trường hợp này? Yêu cầu POST
bao gồm dữ liệu trong phần nội dung của yêu cầu. Không nên chú thích xử lý yêu cầu như vậy?
Tôi nhận thấy rằng tôi có thể thay đổi loại nội dung được gửi bởi JavaScript thành application/json
và thuộc tính consumes
thành MediaType.APPLICATION_JSON_VALUE
để chú thích hoạt động chính xác. Nhưng tại sao nó không hoạt động với một yêu cầu biểu mẫu bình thường?
Lưu ý: Tôi đang sử dụng Spring 3.1.4.
http://matthewsalvatore.blogspot.com.br/2013 /08/spring-framework-working-with-x-www.html – Allenaz