1

我有弹簧控制器:

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

我可以使用 APACHE HTTP CLIENT 像这样发布对象:

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

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

我该如何解决?

4

2 回答 2

3

好的,您缺少一些东西:

  1. 确保您User在客户端和服务器上以相同的方式序列化和反序列化为 json。
  2. 如果您想使用 spring 内置的杰克逊支持(并且最好在客户端也使用它)或HttpMessageConverter为 Gson 包含适当的支持,请确保在类路径上有杰克逊库。为此,您可以使用spring-android 的GsonHttpMessageConverter
  3. 使用 注释您的请求处理程序方法参数@RequestBody
  4. 在使用杰克逊的情况下,正如@ararog 所提到的,请确保您明确排除可以输入或注释整个User类的字段@JsonIgnoreProperties(ignoreUnknown = true)
于 2013-04-07T12:38:53.207 回答
1

据我所知,Spring MVC 使用 Jackson 进行 JSON 解析和序列化/反序列化,jackson 通常期望 JSON 内容具有所有类属性的数据,但标有 JSON 忽略的除外,如下所示:

public class User {

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

   ... getters/setters...
}

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

你有两个选择:

  1. 作为测试,在所有其他属性中设置一个假值并再次发送用户数据
  2. 创建一个 Jackson 混音并为忽略的属性添加注释。
于 2013-04-07T11:34:48.613 回答