如何将JSON对象发布到spring控制器?

时间:2013-04-07 10:58:12

标签: spring post spring-mvc apache-httpclient-4.x

我有弹簧控制器:

@RequestMapping(value = "/add", method = RequestMethod.POST, 
     consumes = "application/json")
public @ResponseBody ResponseDto<Job> add(User user) {
    ...
}

我可以使用APACHE HTTP CLIENT POST这样的对象:

HttpPost post = new HttpPost(url);
List nameValuePairs = new ArrayList();
nameValuePairs.add(new BasicNameValuePair("name", "xxx"));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(post);

在控制器中,我得到名为“xxx”的用户

现在我想创建User对象并将其发布到服务器, 我尝试使用这样的GSON对象:

User user = new User();
user.setName("yyy");

Gson gson = new Gson();
String json = gson.toJson(user);

HttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(json.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpResponse response = client.execute(httpPost);

但是通过这种方式,我进入了具有空字段的服务器User对象......

我该如何解决?

2 个答案:

答案 0 :(得分:3)

好一些你不知道的事情:

  1. 确保在客户端和服务器上以相同的方式将User序列化并反序列化为json。
  2. 如果你想使用spring内置的jackson支持(并且最好在客户端也使用它),或者在Gson中包含适当的HttpMessageConverter,请确保在类路径上有jackson库。您可以使用spring-android中的GsonHttpMessageConverter
  3. 使用@RequestBody注释您的请求处理程序方法参数。
  4. 如果使用jackson,正如@ararog所提到的那样,请确保明确排除可以使用User
  5. 整个@JsonIgnoreProperties(ignoreUnknown = true)课程进入的字段或注释

答案 1 :(得分:1)

据我所知,Spring MVC使用Jackson进行JSON解析和序列化/反序列化,jackson通常期望jSON内容包含所有类属性的数据,除了那些标记有JSON忽略的内容,如下所示: / p>

public class User {

   private String login;
   private String name;
   @JsonIgnoreProperty
   private String password;

   ... getters/setters...
}

因此,如果您创建User的实例,只设置用户名并将此数据发送到服务器,Jackson将尝试将内容反序列化为服务器端的另一个User对象,在反序列化过程中他会考虑这两个必须属性登录名和名称,因为只填充名称,反序列化完成,并且空引用返回给控制器。

您有两种选择:

  1. 作为测试,在所有其他属性中设置假值并再次发送用户数据
  2. 创建Jackson混音并为忽略的属性添加anotations。