【问题标题】:How to bind @RequestParam to object in spring MVC?如何将@RequestParam绑定到spring MVC中的对象?
【发布时间】:2016-06-30 10:09:51
【问题描述】:

我想通过 AJAX 发出一个 POST 请求,我还想将整个类对象绑定到该请求,并且我想接收带有 @requestParam 注释的请求。我知道用@requestBody注解可以做到,但我很想知道:我们可以用@requestParam注解吗?

Ajax 代码:

var restDTO{
    id: 3,
    name: "hello"
}

 $.ajax({
          url: url, 
          type: 'POST',
          dataType: 'json',
          contentType: 'application/json',
          mimeType: 'application/json',
          data: JSON.stringify({RestDTO : restDTO}),          
          success: function(data) 
    {
    }

我确实有 RestDTO

Class RestDTO 
{

    int id;
    String name;

    //getter and setter

}

在控制器中

public String content(@RequestParam RestDTO restDTO){...}

我应该怎么做才能使这段代码运行?

从 ajax 发送数据我应该改变什么?

我是否需要在服务器上进行更改以接收带有 @requestParam 注释的 RestDto 对象?

【问题讨论】:

    标签: java json ajax spring spring-mvc


    【解决方案1】:

    你不能,因为@RequestParam 只是表明,one 方法的参数应该绑定到 one Web 请求的参数。它不能映射到对象。要使用 @RequestParam,您应该更改 ajax 请求:

    var restDTO{
       id: 3,
       name: "hello"
    }
    
     $.ajax({
              url: url, 
              type: 'POST',
              data: restDTO,          
              success: function(data){
                 ....
              }
    });
    

    JQuery 将以application/x-www-form-urlencoded 发送请求,并自动将数据处理为参数。您的控制器的方法应如下所示:

    @RequestMapping("/url")
    public String content(@RequestParam Long id, @RequestParam String name){...}
    

    要自动将参数映射到对象,您可以使用@ModelAttribute 注解:

    @RequestMapping("/url")
    public String content(@ModelAttribute RestDTO restDTO){...}
    

    在这种情况下,javascript 映射中的名称应与 RestDTO 中的属性名称匹配。

    一般来说,@ModelAttribute@RequestBody 的创建目的相同:将数据从请求绑定到方法(无论是原始类型的对象)。

    我认为,@ModelAttribute 更方便,当您使用 html-forms 和普通对象时。有现成可用的 Spring 能力,例如 modelAttributepath

    当您需要手动控制数据时,@RequestBody 更灵活。此外,当您处理复杂的对象时,它更方便。

    我个人更喜欢 @RequestBody 和 json。

    【讨论】:

    • 感谢您的描述,我试过了,我知道了: 1. RequestBody + json。 2. ModelAttribute + application/x-www-form-urlencoded 但最后,我找不到任何区别......我的意思是何时使用?在这两种情况下,javascript 映射都应与属性名称匹配
    • @user3029929 你是对的,这种方法需要同样的东西。但是,在我看来,ModelAttribute 仅在您使用网络表单时非常有用,在其他情况下RequestBody 更方便。
    • @ModelAttribute 从模型中获取对象或将对象添加到模型中。它与任何绑定无关。
    • @zeroflagL,嗯。您是否阅读过此文档:docs.spring.io/spring/docs/current/spring-framework-reference/…?你能解释一下,下一句是什么意思:...Once present in the model, the argument’s fields should be populated from all request parameters that have matching names. This is known as data binding in Spring MVC...?你不知道为什么,根据这个文档BindingResult 应该留在@ModelAttribute 参数之后吗?很想看看你的解释。
    • 绑定在有或没有@ModelAttribute 的情况下发生。这是已发布表单的默认行为。您故意省略了文档的相关部分,即前面的两句话:“方法参数上的@ModelAttribute 表示应从模型中检索该参数。如果模型中不存在该参数,则应首先实例化该参数,然后然后添加到模型中。”。这,也只有这个,是@ModelAttribute 的目的。
    【解决方案2】:

    如果您将数据作为经典请求参数发送,您可以通过简单地省略 @RequestParam 来绑定到对象,所以

    public String content(RestDTO restDTO){...}
    

    如果您要发送json,则必须使用@RequestBody

    如果您坚持使用 @RequestParam,请注意您可以将多个值绑定到地图上,所以

    public String content(@RequestParam Map<String, String> restDTO){...}
    

    来自@RequestParam 文档

    如果方法参数是 Map 或 MultiValueMap 且未指定参数名称, 然后使用所有请求参数名称填充 map 参数 和价值观。

    【讨论】:

    • 它总是在 RestDTO 中给出属性(id、名称)的 NULL 值
    • 抱歉,漏了一分。如果您以 json 格式发送数据,则必须使用 @RequestBody
    • 有什么方法可以在类对象中使用@requestParam 接收数据??但是在 ajax 方面,我无论如何都可以选择
    • 可以绑定地图,我已经添加到答案中了
    【解决方案3】:

    在 spring web 中你有这些注释:

    RequestParam - 用于获取参数 (/path?name=)

    PathVariable - 用于路径参数 (/path/{name})

    RequestBody - 用于发布/放置/补丁等正文

    RequestHeader - 用于标头

    所以你不能将 RequestParam 用于 post 参数,不管是不是 json

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 2011-04-09
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多