2010-08-25 1 views
4

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

$.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); 
} 

Не беспокойтесь об ответе на этот вопрос, мне все равно о обрабатывает запрос, я знаю, как иметь дело с ответами.

EDIT:

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

выберите 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: Тип содержимого «приложение/json 'не поддерживается

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

ответ

6

Вашего JQuery Ajax вызов производит следующий 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 с и свойств индексированных со строками в 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, как предполагает Bozho. Вы можете найти пример такого подхода в mvc-showcase sample.

+0

это работает, кажется, что если Spring справится с этим, он должен будет перейти прямо к HashMap, пропустите этого среднего человека, но ваш код работает точно так же, как напечатано – walnutmon

+0

Я добавил редактирование наверху, которое пытается использовать решение JSON, но оно не работает, хотя и проницательность? – walnutmon

+0

@walnutmon: Чтобы заставить его работать, вам нужно иметь библиотеку Jackson JSON Mapper (http://jackson.codehaus.org/) по пути к классам (а также '' в XML Spring). – axtavt

3

если вы <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

Мне нравится этот ответ, к сожалению, я получаю исключение «org.springframework.web.HttpMediaTypeNotSupportedException: Тип содержимого«применение/х-www- form-urlencoded «не поддерживается», это самое близкое к тому, что я хотел бы, но код не работает, как есть – walnutmon

+1

@walnutmon see muy update. – Bozho

+0

@Bozho: jQuery в любом случае не сериализуется в JSON. Необходима ручная сериализация, например, 'JSON.stringify' из http://json.org – axtavt