我对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控制器?
答案 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;
,并使用新类作为控制器方法的参数。古德勒克。