Spring MVC, десериализовать один JSON? - PullRequest
7 голосов
/ 20 января 2012

Как я могу легко разделить значения JSON, которые отправляются в одном и том же запросе?

При условии, что я отправляю JSON на свой сервер:

{"first":"A","second":"B"}

Если я реализую следующий метод вКонтроллер:

@RequestMapping(value = "/path", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void handleRequest(@RequestBody String input) { 
    // ...
}

, тогда параметр input будет представлять собой строку со всем объектом JSON, {"first":"A","second":"B"}.То, что я действительно хочу, - это две отдельные строки (или строка и int, в зависимости от того, что подходит для конкретного запроса) только с двумя значениями (другие пары ключ / значение, которые клиент может отправить, должны игнорироваться).

Если бы строки были отправлены как параметры запроса вместо тела запроса JSON, это было бы просто:

@RequestMapping(value = "/path", method = RequestMethod.POST)
public void handleRequest(@RequestParam("first") String first, 
                          @RequestParam("second") String second) { 
    // ...
}

Я знаю, что могу создать простой класс компонента, который можно использовать вместе с@RequestBody аннотация, которая будет содержать A и B при использовании, но выглядит как обходной путь, поскольку они будут иметь разные цели внутри веб-приложения.

Зависимости: org.springframework: spring-web: 3.1.0.RELEASE org.codehaus.jackson: jackson-mapper-asl: 1.9.3

Ответы [ 2 ]

5 голосов
/ 20 января 2012

POJO

public class Input {
    private String first;
    private String second;

    //getters/setters
}

... и затем:

public void handleRequest(@RequestBody Input input)

В этом случае вам нужно, чтобы Джексон был доступен на CLASSPATH.

Карта

public void handleRequest(@RequestBody Map<String, String> input)
3 голосов
/ 21 января 2012

Я написал пользовательский WebArgumentResolver , который делает именно это, в сочетании с пользовательской аннотацией.

У меня нет доступного мне источника сейчас, но в основном я аннотировал свой методкак это:

@RequestMapping(value = "/path", method = RequestMethod.POST)
public void handleRequest(@JsonField("first") String first, @JsonField("second") String second) { 
    // ...
}

Затем my JsonFieldWebArgumentResolver проверяет, помечен ли параметр метода с помощью JsonField, и если это так, то извлекает фактический тип из параметра (не совсем просто, оказывается,если вы также хотите обрабатывать общие параметры, такие как List<String> или List<Pojo>), и вручную вызывать JsonParser Джексона для создания правильного типа.Жаль, что я не могу показать вам какой-либо код, но в этом его суть.

Однако , это решение для Spring MVC 3.0 , и если вы 3.1 Я думаю, что вам будет лучше использовать вместо этого пользовательский HandlerMethodArgumentResolver .Но идея должна быть такой же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...