我有弹簧控制器:
@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对象......
我该如何解决?
答案 0 :(得分:3)
好一些你不知道的事情:
User
序列化并反序列化为json。HttpMessageConverter
,请确保在类路径上有jackson库。您可以使用spring-android中的GsonHttpMessageConverter。@RequestBody
注释您的请求处理程序方法参数。User
@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对象,在反序列化过程中他会考虑这两个必须属性登录名和名称,因为只填充名称,反序列化完成,并且空引用返回给控制器。
您有两种选择: