我正在使用jquery ui sortable
对项目中的页面顺序进行重新排序,但是似乎我不知道如何在Spring Boot中正确处理此发布的Ajax数据。
jquery / ajax
$("table#pages tbody").sortable({
items: "tr:not(.home)",
placeholder: "ui-state-highlight",
update: function () {
let ids = $("table#pages tbody").sortable("serialize");
let url = "/admin/pages/reorder";
// $.post(url, ids, function (data) {});
$.ajax({
url: url,
method: "post",
data: ids,
beforeSend: function () {
},
complete: function () {
},
success: function (response) {
}
});
}
});
因此,从上面看,ids
变量应该是一个名为id
的数组整数,因此我应该在我的请求处理程序= int[] id
中得到类似以下的内容(单个ID是正确的) )
因此,出于上述考虑,我尝试在我的请求处理程序方法中执行此操作:
@PostMapping("reorder")
public void reorder(int[] id) {
int count = 1;
Page page;
for (int pageId : id) {
page = pageRepo.getOne(pageId);
page.setSorting(count);
pageRepo.save(page);
count++;
}
}
但是使用断点,我可以看到id
实际上是null
,因此请求处理程序显然没有获取发送的Ajax数据。
我在Chrome中看到的错误是:
error: "Internal Server Error"
我尝试将@RequestBody
添加到方法参数中,如下所示:
public void reorder(@RequestBody int[] id) {...
但是在那种情况下,它甚至根本没有达到方法中的断点,并且在chrome中出现以下错误:
error: "Unsupported Media Type"
如果不手动设置内容类型,则会得到以下请求有效负载
请求有效载荷:
id[]=29&id[]=3
内容类型:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
我可以将内容类型设置为json,但是仍然会出现错误,并且我从来没有在其他技术中这样做,所以我怀疑这是问题所在。
答案 0 :(得分:0)
由于有效载荷为id[]=29&id[]=3
,因此您需要
public void reorder(@RequestParam("id[]") int[] id) {
因为id[]
是一个非标准的查询参数名称,不能从id
方法参数名称中得出。