Spring 3 MVC - 高级数据绑定 - 使用简单对象列表的表单请求
Spring 3 MVC - 高级数据绑定 - 使用简单对象列表的表单请求
我已经阅读了所有的Spring 3 Web文档: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()方法接受一个String而不是一个Person,请求将成功,但是String为空。
在Spring 3中,使用Jackson的集成可以非常方便地处理JSON数据。下面是一个在Stack Overflow上的问题和答案,可以帮助我们了解如何在Spring 3中使用Jackson来处理JSON数据。
问题链接:[Spring 3.0 making JSON response using jackson message converter](https://stackoverflow.com/questions/2259551)
在这个问题中,用户想要在Spring 3中使用Jackson来处理JSON响应。他们想要将一个对象转换为JSON格式的响应并返回给客户端。用户希望了解如何配置和使用Jackson消息转换器来实现这个目标。
解决方法是使用Jackson的消息转换器来处理JSON响应。首先,用户需要添加Jackson库的依赖到他们的项目中。然后,他们需要在Spring的配置文件中配置Jackson消息转换器。这个配置告诉Spring在处理响应时使用Jackson来将对象转换为JSON格式。
以下是一个使用Jackson消息转换器的示例代码:
@Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converters.add(converter); } }
在这个示例中,我们创建了一个WebMvcConfigurerAdapter的子类,并重写了configureMessageConverters方法。在方法中,我们创建了一个MappingJackson2HttpMessageConverter实例,并将其添加到HttpMessageConverter列表中。这样,Spring就会在处理响应时使用Jackson来将对象转换为JSON格式。
通过这种方式,用户可以在Spring 3中使用Jackson来处理JSON响应。他们只需要添加Jackson库的依赖,并配置Jackson消息转换器,就可以将对象转换为JSON格式的响应并返回给客户端。这使得处理JSON数据变得非常简单和强大。
问题的原因是在使用Spring MVC进行表单请求时,如果没有正确配置,会导致无法将表单数据绑定到List对象上。解决方法是正确配置Spring MVC,并将请求的Content-Type设置为application/json。
在这段代码中,如果启用了
@RequestMapping(value="/controllerMethod", method=RequestMethod.POST) public String doSomething(Listpeople) { System.out.println( wantToSeeListOfPeople ); }
但是,如果不设置Content-Type为application/json,可能会遇到Exception: "org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded' not supported"的问题。
为了解决这个问题,可以尝试将$.ajax请求的Content-Type设置为application/json。如果不起作用,可以手动将对象序列化为JSON字符串,然后将字符串作为data发送请求。
此外,还有一个相关的问题是当使用jQuery发送对象作为data参数时,默认会使用jQuery.param进行序列化。要使用JSON,可以手动将对象转换为JSON字符串,并将字符串作为data参数发送请求。
如果仍然遇到"unsupported media type"的问题,可能需要在Spring中配置JSON解析器以正确处理JSON数据。
以上是这个问题的原因和解决方法的总结,如果需要更详细的讨论和帮助,请参考stackoverflow.com/questions/16409036/…。
问题的原因是Spring MVC无法直接将复杂类型绑定到HashMap中,需要使用自定义对象来进行绑定。解决方法是将数据序列化为JSON,在发送之前使用ajax请求发送,并使用Jackson JSON Mapper库进行绑定。
在上述代码中,发送的请求体是以application/x-www-form-urlencoded
格式进行编码的。Spring MVC可以将数字索引的属性绑定到List中,将字符串索引的属性绑定到Map中。所以,我们需要一个自定义的对象来接收这些数据。
解决方法是创建一个名为People的类,其中包含一个List属性people,其元素类型为HashMap
另外,我们也可以在发送数据之前将其序列化为JSON格式,并在后端使用Jackson JSON Mapper库进行反序列化和绑定。这种方法需要在类路径中添加Jackson JSON Mapper库,并在Spring的XML配置文件中添加
需要注意的是,如果使用JSON序列化的方法仍然无法解决问题,可能是因为缺少必要的依赖库或配置。在问题描述中提到的示例代码也存在同样的问题。
解决这个问题的方法是通过自定义对象来进行数据绑定,并使用Jackson JSON Mapper库进行序列化和反序列化。如果仍然无法解决问题,需要检查是否缺少必要的依赖库或配置。