首页 > 解决方案 > 如何在spring boot中处理ajax post数据

问题描述

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

标签: javaajaxspring-boot

解决方案


由于有效载荷是id[]=29&id[]=3,那么您需要

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

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


推荐阅读