2016-12-27 80 views
0

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

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

当我试图通过同样的方法,但通过使用按键发送多个列表,它在Spring控制器接收到如下图所示,我认为是有效的

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

我得到类似下面在Spring控制器中。

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

如何在Spring控制器重复这种并将其存储到我的域对象。

这是正确的做法或有没有更好的方式来做到这一点

+0

这是搞砸了。你想发送什么?什么?你的Alist或Blist不是列表(在数组的意义上),而是一个键值映射(或更简单:一个对象)。你想发送一个对象列表吗?你的域名对象是什么样的? –

+0

那是正确的,我想发送域对象的列表。我们可以假设域对象包含字段a和b。 我所做的是我收到它作为简单对象 的数组对象@RequestBody [] objDetail 后来我反复使用它和JSONArray我能得到的值,按需 – CrazyMac

+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 
}); 

但是你的春天的一面可以改进。对象数组(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 

} 

并收到来自角JSON对象的确切Java表示对象的列表。

//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(); 

注: 以上

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的情况下,流:你可以使用的foreach运营商重复在一个标准的Java方法的列表,例如解决方案将工作,如果你已经配置了对象映射器。如果您使用任何Web Starter使用Spring引导,您将免费获得它。在标准的spring项目中(自己配置),您必须将jackson库包含到项目的类路径中,并在配置类或xml中注册ObjectMapper bean。

+0

当然,我会尝试这个并发布我的回应 – CrazyMac

相关问题