-1

我已经有这样的javascript AJAX POST:

客户端:

<script language="JavaScript" type="text/javascript">
    var column = "test1";
    var filterType = 1;
    var values = [];
    var filter = { "column" : column, "filterType" : filterType, "values": values};
    var filter2 = { "column" : column, "filterType" : filterType, "values": values};
    filter2.column = "test2";
    var filters = new Array();
    filters[0] = filter;
    filters[1] = filter2;

    $.ajax({  
        url: "${pageContext.request.contextPath}/api/user_administration/get", 
        data: JSON.stringify(filters),  
        type: "POST", 
        beforeSend: function(xhr) 
        {  
            xhr.setRequestHeader("Accept", "application/json");  
            xhr.setRequestHeader("Content-Type", "application/json");  
        },
        success: function(user)
        {  

        }
    });
</script>

服务器端:

@RequestMapping(value = "user_administration/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<User> get(@RequestBody ColumnFilter[] filters)
{
    //do something
    return userService.getAll();
}

现在我想传递两个或更多参数。像这样的东西:

@RequestMapping(value = "user_administration/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<User> get(@RequestBody ColumnFilter[] filters, @RequestBody ColumnSorter[] sorters)
{
    //do something
    return userService.getAll();
}

有可能实现这一目标吗?如何?

(我已经知道我可以将它们封装到另一个对象/类/实体中)

4

2 回答 2

0

Spring文档说:

@RequestBody 方法参数注解表示方法参数应该绑定到 HTTP 请求体的值。

这假设 HTTP 请求正文不可分割。因此,您需要做的就是遵循解决方法。在这里您可以看到完全相同的问题Spring REST multiple @RequestBody 参数,可能吗?

于 2013-11-13T10:17:54.073 回答
0

在你的 AJAX 调用中,你有这条线

 data: JSON.stringify(filters),  

更改或扩展此行以向请求添加其他参数。如果您不清楚发生了什么或需要记录/诊断/调试它,您可以随时使用中间变量..

您可以data作为 Javascript 键值对象(提供命名参数)、字符串或 - 就像现有代码一样 - 通过 JSON 编码对象来传递。

由于您似乎想要传递更多字段/参数并且已经在使用 JSON 编码,因此在 JSON 编码之前将它们构建到更大的“有效负载”对象中可能最有意义。

 var paramData = {filter:filters, sorters: mySortersOrWhatever};
 console.log('some administration AJAX request', paramData);
 $.ajax({ 
     ...
     data: JSON.stringify(paramData)

看看它是如何与 Spring 的请求解析接口的——要在 Spring 端解码两个单独的参数,你要么需要名称(不仅仅是请求体),从命名参数中解码它们,要么(最简单)只接受一个大参数JSON 对象作为参数。

这应该是相当直截了当的——一如既往地遵循基本的软件工程原则(记录、诊断、修复它直到它工作),这样你就可以构建所需的工作功能。

于 2013-11-13T10:12:36.653 回答