在Spring MVC控制器中反序列化json数组

时间:2014-12-23 03:19:29

标签: java json spring spring-mvc

我发送了一个json对象列表,并尝试在Spring控制器中反序列化它。但是我一直得到“错误请求”的错误并将结果转换为状态代码415.但是,我的json数组是有效的。

json是 -

  

{       “用户”:[           {               “userName”:“john”,               “email”:“john@gmail.com”,               “user_id”:“u223344”           },           {               “userName”:“史密斯”,               “email”:“smith@gmail.com”,               “user_id”:“u223345”           }       ]   }

Ajax调用如下 -

$.ajax({
url: $("#addNewUser").attr("action"),
data: JSON.stringify({users : dataToSend}),
dataType: 'json',
type: "POST",   
beforeSend: function(xhr) {
    xhr.setRequestHeader("Accept", "application/json");
    xhr.setRequestHeader("Content-Type", "application/json");
}, 
success: function(data){ 
       alert('success=  ' + data);
},
error:function(data,status,er) { 
    alert("error: "+ data.responseText +" status: "+status+" er:"+er);
}

});

包装类如下。 User和UserWrapper类 -

public class User {

private String email;

private String userName;

private String user_id;

//getters and setters

}

public class UserWrapper {

private List<User> userList;

//getter and setter

}

最后,弹簧MVC控制器是 -

@RequestMapping(value="/user/add", method=RequestMethod.POST, 
        produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void createTeamMember(@RequestBody UserWrapper userWrapper) {

    try{
        for(User user : userWrapper.getUserList()){
            System.out.println(user.getEmail());
            }
    }catch(Exception ex){
        ex.printStackTrace();
    }

}

我在pom.xml中添加了对jackson-core和jackson-mapper的依赖。我使用的是Spring 4.0.3。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

正如@shazin所说,你很可能在你的问题上发布了错误的方法,如果没有,只需做出他建议的改变。

您需要另一个修复,即将usersList属性从UserWrapper重命名为users,以便它与正在发送的JSON属性匹配。

我们已经修复了这些问题,因为您的请求没问题,所以不应该有其他问题。

答案 1 :(得分:1)

我认为您需要将@RequestBody POJO更改为UserWrapper

@RequestMapping(value="/task/add", method=RequestMethod.POST, 
        produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public void createTeamMember(@RequestBody UserWrapper userWrapper) {
    // Code to create members
}

答案 2 :(得分:0)

我不会怀疑服务器端绑定错误,因为您收到415 - 不支持的媒体类型错误。您正在控制器上设置正确的媒体类型,因此服务器端看起来很好。

在客户端,请确保使用jquery 1.5+以确保调用beforeSend()方法。

更容易找到内容类型,

$.ajax({
        url:api,
        ....
        contentType: "application/json"
    });

请检查来自浏览器的网络请求,并确保在标题中设置内容类型。

如果您收到400-Bad Request,那么您可以开始查看反序列化问题。