Spring 3 MVC - расширенное связывание данных - запрос формы со списком простых объектов - PullRequest
5 голосов
/ 25 августа 2010

Я прочитал все веб-документы Spring 3: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/spring-web.html, но не смог найти какой-либо интересной документации по привязке более сложных данных запроса, например, допустим, я использую jQuery для публикации втакой контроллер:

$.ajax({
    url: 'controllerMethod',
    type: "POST",
    data : {
        people : [
        {
            name:"dave", 
            age:"15"
        } ,
{
            name:"pete", 
            age:"12"
        } ,
{
            name:"steve", 
            age:"24"
        } ]
    },
    success: function(data) {
        alert('done');
    }
});

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

Чтобы получитьВы начали:

@RequestMapping("/controllerMethod", method=RequestMethod.POST)
public String doSomething() {
    System.out.println( wantToSeeListOfPeople );
}

Не беспокойтесь об ответе на этот вопрос, все, что меня волнует, - это обработка запроса, я знаю, как обращаться с ответами.

РЕДАКТИРОВАТЬ:

У меня есть еще пример кода, но я не могу заставить его работать, что мне здесь не хватает?

выберите javascript:

var person = new Object();
    person.name = "john smith";
    person.age = 27;

    var jsonPerson = JSON.stringify(person);

    $.ajax({
        url: "test/serialize",
        type : "POST",
        processData: false,
        contentType : 'application/json',
        data: jsonPerson,
        success: function(data) {
            alert('success with data : ' + data);
        },
        error : function(data) {
            alert('an error occurred : ' + data);
        }
    });

метод контроллера:

public static class Person {

        public Person() {
        }

        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        String name;
        Integer age;

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @RequestMapping(value = "/serialize")
        @ResponseBody
        public String doSerialize(@RequestBody Person body) {
            System.out.println("body : " + body);
            return body.toString();
        }

это приводит к следующему исключению:

org.springframework.web.HttpMediaTypeNotSupportedException: тип содержимого 'application / json' не поддерживается

Если метод doSerialize () принимает строку в отличие от персоны, запрос выполняется успешно, но строка пуста

Ответы [ 3 ]

6 голосов
/ 25 августа 2010

Ваш ajax-вызов jQuery создает следующее application/x-www-form-urlencoded тело запроса (в% -декодированной форме):

people[0][name]=dave&people[0][age]=15&people[1][name]=pete&people[1][age]=12&people[2][name]=steve&people[2][age]=24

Spring MVC может привязывать свойства, индексированные по номерам к List s, и свойства, индексированные по строкамдо Map с.Вам нужен пользовательский объект здесь, потому что @RequestParam не поддерживает сложные типы.Итак, у вас есть:

public class People {
    private List<HashMap<String, String>> people;

    ... getters, setters ...
}

@RequestMapping("/controllerMethod", method=RequestMethod.POST)        
public String doSomething(People people) {        
    ...
} 

Вы также можете сериализовать данные в JSON перед отправкой, а затем использовать @RequestBody, как предлагает Божо.Вы можете найти пример такого подхода в примере mvc-showcase .

3 голосов
/ 25 августа 2010

если у вас включено <mvc:annotation-driven>, тогда:

@RequestMapping("/controllerMethod", method=RequestMethod.POST)
public String doSomething(@RequestBody List<Person> people) {
    System.out.println( wantToSeeListOfPeople );
}

(List<Person> может не соответствовать структуре, которую вы хотели бы получить, это просто пример здесь)

попробуйте установить Content-Type из $.ajax равным application/json, если это не сработает немедленно.

0 голосов
/ 03 мая 2011

Посмотрите на пружинную интеграцию Джексона .Он невероятно прост в использовании и мощен.

Вопрос / ответ по SO, который может помочь в этом: Spring 3.0 для получения ответа JSON с помощью конвертера сообщений Джексона

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