如何将多个Arrays从AngularJS传递给Spring Controller

时间:2016-12-27 06:26:21

标签: angularjs spring-mvc

我试图通过POST调用将多个列表从AngularJS传递给Spring控制器。如果我只发送一个如下所述的列表,它在Spring控制器上工作正常,但想知道从Angular向Spring发送多个列表的最佳方法。

$scope.formData = [];
var AList = [];
AList.push({'a': 1, 'b' :2});
$scope.formData = AList;
$http.post('saveData', $scope.formData).success(function(resp){});

当我尝试通过相同的方法发送多个列表但是使用push时,它在Spring控制器中被接收,如下所示,我认为是有效的

$scope.formData.push(Alist);
$scope.formData.push(Blist);

我在Spring Controller中得到类似的内容。

[[ {a=1, b=2}, {a=3, b=4} ]]

如何在Spring Controller中迭代它并将其存储到我的域对象中。

这是正确的方法还是有更好的方法

1 个答案:

答案 0 :(得分:1)

您的前端方法是正确的。您需要做的就是创建一个空数组,根据需要推送尽可能多的对象并将其发布到服务器。

//Create an empty array
$scope.formData = [];

//Push as many objects as you need
$scope.formData.push({'a' : 1, 'b' : 2});
$scope.formData.push({'a' : 3, 'b' : 4});

//Post it to server
$http.post('saveData', $scope.formData).success(function(resp){
    //handle response
});

但是你的Spring方面可以改进。对象数组(Object[])通常已被弃用,因为它们不是类型安全的,因此容易出错。应尽可能用参数化集合(来自Java Collections Framework)替换它们。

在您的情况下,您可以应用以下步骤:

创建域对象或DTO的类,它对应于收到的json对象。

public class MyDomainObject {

    private Integer a;
    private Integer b;

    public MyDomainObject(){ }

    //getters and setters omitted

}

然后在您的端点方法切换@RequestBody中输入Object[]List<MyDomainObject>

@RequestMapping(path = "/saveDate", method = RequestMethod.POST)
public void postDomainObjects(@RequestBody List<MyDomainObject> myDomainObjects){

    //Do some business logic.
    //i.e. pass further to service or save to database via repository

}

并且您会收到一个对象列表,这些对象是来自angular的json对象的精确java表示。您可以使用标准的java方式迭代列表,例如使用 foreach 运算符:

for (MyDomainObject obj : myDomainObjects) {

    //do something with each object.

    //i.e. print value of "a" field
    System.out.println("Value of a: " + obj.getA());
}

或在java 8的情况下使用 stream

//Apply some filtering, mapping or sorting to your collection.

//i.e. count sum of "a" field values.
int sumOfAFields = myDomainObjects.stream()
    .mapToInt(o -> o.getA())
    .sum();

注意: 如果您已配置对象映射器,则上述解决方案将起作用。如果您将Spring引导与任何网络启动器一起使用,您将免费获得它。在标准的spring项目中(自己配置),必须在项目的类路径中包含 jackson 库,并在配置类或xml中注册ObjectMapper bean。