Spring 3 MVC - 高级数据绑定 - 使用简单对象列表的表单请求

13 浏览
0 Comments

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为空。

0
0 Comments

在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数据变得非常简单和强大。

0
0 Comments

问题的原因是在使用Spring MVC进行表单请求时,如果没有正确配置,会导致无法将表单数据绑定到List对象上。解决方法是正确配置Spring MVC,并将请求的Content-Type设置为application/json。

在这段代码中,如果启用了,则可以使用以下方式接收表单请求:

@RequestMapping(value="/controllerMethod", method=RequestMethod.POST)
public String doSomething(List people) {
    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/…

0
0 Comments

问题的原因是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库进行序列化和反序列化。如果仍然无法解决问题,需要检查是否缺少必要的依赖库或配置。

0