我试图通过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中迭代它并将其存储到我的域对象中。
这是正确的方法还是有更好的方法
答案 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。