使用Spring MVC将对象数组传递给Controller

时间:2016-11-03 14:40:31

标签: java spring spring-mvc arraylist

我对Spring MVC有点新,我在使用我的一个控制器方法时遇到问题,我传递了两个参数:一个对象,另一个是对象数组。我正在使用Ajax调用将数据POST到API控制器,但每次对象数组都会返回以下错误:

  

无法实例化[[Lcom.name.models.UserAccessListMembers;]:找不到默认构造函数;嵌套异常是java.lang.NoSuchMethodException:

这是控制器方法:

@ResponseBody
@RequestMapping(value = "/api/user/save/accesslist", method = RequestMethod.POST)
public String saveAccessList(UserAccessLists list, UserAccessListMembers[] members){

    <code here>
}

这是javascript:

var newEntries = [];
        var newEntry = {"id" : null, "listId" : 1, "wwid" : "abc123" };
        newEntries.push(newEntry);
        var theList = {"id": 1, "userId" : null, "name": "new list" };
        $.ajax({
            method: "POST",
            url: window.contextPath + '/api/user/save/accesslist',
            data: {list : theList, members : newEntries },
            async: false,
            cache: false,
            success: function () {
                  <do stuff>
            },
            error: function (xhr, textStatus, errorThrown) {
                console.log("xhr: ", xhr);
            }
        });

最后这里是 UserAccessListMembers

public class UserAccessListMembers implements java.io.Serializable {

private Integer id;
private Integer listId;
private String wwid;
private String personName;

public UserAccessListMembers() {
}

public UserAccessListMembers(Integer id, Integer listId, String wwid) {
    this.id = id;
    this.listId = listId;
    this.wwid = wwid;
}
   < getters and setters below here >
}

你可以看到我在UserAccessListMembers类中有两个构造函数,一个默认构造函数和一个包含所有必需属性的构造函数。我不确定我做错了什么,或者因为我来自.NET MVC背景而错过了一篇文章。

任何人都可以帮我弄清楚如何让Spring MVC正确映射和实例化该类吗?这里有什么一些最佳实践用于将对象发送到MVC控制器?

2 个答案:

答案 0 :(得分:0)

假设您正在使用maven,请将以下内容添加到您的pom中,以便Jackson进入类路径:

   <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.6.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.3</version>
    </dependency>

只要将正确的json传递给控制器​​,它就会反序列化它。

要测试它,您可以使用以下内容:

public class JacksonTest {
    @Test
    public void test1() throws IOException {
        String test = "[{\"id\" : null, \"listId\" : 1, \"wwid\" : \"abc123\"}]";
        UserAccessListMembers[] userAccessListMemberses = new ObjectMapper().readValue(test, UserAccessListMembers[].class);
        for (UserAccessListMembers members : userAccessListMemberses) {
            System.out.println(members);
        }
    }
}

答案 1 :(得分:0)

您可以创建一个名为UserAccessListMembersArray的单独类,并在该类中创建一个字段List<UserAccessListMembers> members;,并使用新类作为控制器方法的参数。古德勒克。