2013-04-07 2 views
1

У меня есть контроллер пружинный:Как установить POST JSON на контроллер пружины?

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

я могу отправить объект, как это с APACHE HTTP КЛИЕНТА:

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

В контроллере я пользователь с именем «ххх»

Теперь я хочу для создания объекта 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); 

Но таким образом я получаю на сервере объект пользователя с нулевыми полями ...

Как его решить?

ответ

3

Ok несколько вещей, которые вы пропали без вести:

  1. Убедитесь, что вы сериализации и десериализации User к JSon так же, как на клиенте и сервере.
  2. Убедитесь, что у вас есть библиотеки jackson на пути к классам, если вы хотите использовать встроенную поддержку jackson с пружиной (и предпочтительно использовать ее на клиенте) или включить подходящий HttpMessageConverter для Gson. Вы можете использовать GsonHttpMessageConverter от весеннего андроида для этого.
  3. Аннотировать параметр метода обработчика запроса с помощью @RequestBody.
  4. В случае использования Джексона, так как @ararog упоминалось, убедитесь, что вы специально исключить поля, которые могут быть ingored или аннотировать весь User класс с @JsonIgnoreProperties(ignoreUnknown = true)
+0

Спасибо, я добавили @RequestBody и джексон и это работало ! Я также нашел этот http://stackoverflow.com/questions/13406362/default-json-to-object-mapping-not-working – prilia

1

Насколько я знаю, Spring MVC использует Jackson для разбора и сериализации/десериализации JSON, обычно Jackson ожидает, что для содержимого JSON, который имеет данные для всех свойств класса, кроме тех, кто отмечен JSON ignore, как показано ниже:

public class User { 

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

    ... getters/setters... 
} 

Таким образом, если вы создаете экземпляр пользователя набор только имя пользователя и отправить эти данные на сервер, Джексон попытается десериализацией содержания к другому объекту пользователя на стороне сервера, в процессе десериализации он рассмотрите два логических имени и имени обязательных свойств, так как только имя заполнено, десериализация завершена, и пустая ссылка возвращается контроллеру.

У вас есть два варианта:

  1. В качестве теста, установить поддельное значение во всех других свойствах и отправить данные пользователя снова
  2. Создать Джексон микс-и добавить разъяснения к игнорируемым свойствам.
Смежные вопросы