【问题标题】:How to POST JSON object to spring controller?如何将 JSON 对象发布到弹簧控制器?
【发布时间】:2013-04-07 10:58:12
【问题描述】:

我有弹簧控制器:

@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”的用户

现在我想创建用户对象并将其发布到服务器, 我尝试像这样使用 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);

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

我该如何解决?

【问题讨论】:

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


    【解决方案1】:

    好吧,你缺少一些东西:

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

    【讨论】:

    【解决方案2】:

    据我所知,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 混音并为忽略的属性添加注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多