提问者:小点点

为什么我得到一个必需的请求参数<>方法参数类型Long不存在时,它被正确地设置在我的API调用?


我遇到了一个问题非常类似的一个描述在这个线程

然而,那里提出的解决方案都没有帮助,所以我将感谢这里任何人能提供的任何帮助。

我有一个网页,应该使用Ajax.Data调用从Spring Boot Restendpoint获取数据(此处描述)。

我的Spring Boot RestAPI如下

@PostMapping(value = "/ajax/my-ajax-api")
public MyResponseDto runThisMethod(@RequestParam Long myId, @RequestParam Integer myOtherParameter) {
///
}

通过以下Javascript代码调用该API

if ($("#myDetailsDataTable").length) {
    var myDataTable = $("#myDetailsDataTable").DataTable({
        "order": [[ 0, 'asc' ]],
        "stateSave": true,
        "stateDuration": -1,
        "autoWidth": false,
        "ajax": {
            url: "/ajax/my-ajax-api",
            type: "POST",
            dataSrc: "myResponseItem",
            data: function ( d ) {
                d.myId = $('#myId').val();
                console.log(d.myId)
                d.myOtherParameter = $('#myOtherParameter').val();
                console.log(d.myOtherParameter)
            }
        },
        "columns": [
        //Do a bunch of stuff with the column data here
        ]
    });

    setInterval( function () {
        myDataTable.ajax.reload(null, false);
    }, 3000 );

    myDataTable.on( 'xhr', function () {
        let ajaxResponseJson = myDataTable.ajax.json();
        //Do a bunch of stuff with the JSON
    });
}

问题是myIdmy其他参数参数没有被"ajax"命令分配/填充,出于某种原因我无法确定。控制台. log语句已经证明它们在调用时肯定被填充在Javascript中,所以我不知道为什么它们被排除在API调用之外。

这是错误响应:

error: "Required request parameter 'myId' for method parameter type Long is not present"
path: ""
status: 400

此代码适用于其他用户。我尝试过清除浏览器缓存并进行调用。我也尝试过使用其他浏览器。但每次都会发生相同的400错误。我只能猜测这与我的特定环境配置有关。但我不知道它可能是什么。我正在使用Java17,IntelliJ IDEA 2022.2.1和最新的Chrome。


共1个答案

匿名用户

我找到了一个有效的解决方案,即使我无法确定问题的根源。

问题是Ajax POST请求。在某些机器上,请求参数似乎将作为请求正文的一部分提交,这导致Restendpoint响应错误请求。

解决方案是将命令更改为GET请求并将endpoint更改为GetMaps

"ajax": {
            url: "/ajax/my-ajax-api",
            type: "GET",
            dataSrc: "myResponseItem",
            data: function ( d ) {
                d.myId = $('#myId').val();
                d.myOtherParameter = $('#myOtherParameter').val();
            }
        }
@GetMapping(value = "/ajax/my-ajax-api")
public MyResponseDto runThisMethod(@RequestParam Long myId, @RequestParam Integer myOtherParameter) {
///
}