如何在Spring Boot中处理Ajax发布数据

时间:2019-04-18 15:36:33

标签: java ajax spring-boot

我正在使用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,但是仍然会出现错误,并且我从来没有在其他技术中这样做,所以我怀疑这是问题所在。

1 个答案:

答案 0 :(得分:0)

由于有效载荷为id[]=29&id[]=3,因此您需要

public void reorder(@RequestParam("id[]") int[] id) {

因为id[]是一个非标准的查询参数名称,不能从id方法参数名称中得出。