Spring MVC - 为什么不能一起使用@RequestBody和@RequestParam

2023-12-09

使用带有 Post 请求和 Content-Type application/x-www-form-urlencoded 的 HTTP 开发客户端

1)仅@RequestBody

网址:本地主机:8080/SpringMVC/欢迎
正文:名称=abc

@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestBody String body, Model model) {
    model.addAttribute("message", body);
    return "hello";
}
// Gives body as 'name=abc' as expected

2)仅@RequestParam

网址:本地主机:8080/SpringMVC/欢迎
在正文中 - name=abc

@RequestMapping(method = RequestMethod.POST)
public String printWelcome(@RequestParam String name, Model model) {
    model.addAttribute("name", name);
    return "hello";
}
// Gives name as 'abc' as expected

3)两者一起

网址:本地主机:8080/SpringMVC/欢迎
正文:名称=abc

@RequestMapping(method = RequestMethod.POST)
public String printWelcome(
    @RequestBody String body, 
    @RequestParam String name, Model model) 
{
    model.addAttribute("name", name);
    model.addAttribute("message", body);
    return "hello";
}
// HTTP Error Code 400 - The request sent by the client was syntactically incorrect.

4) 以上参数位置已更改

网址:本地主机:8080/SpringMVC/欢迎
正文:名称=abc

@RequestMapping(method = RequestMethod.POST)
public String printWelcome(
    @RequestParam String name, 
    @RequestBody String body, Model model) 
{
    model.addAttribute("name", name);
    model.addAttribute("message", body);
    return "hello";
}
// No Error. Name  is 'abc'. body is empty

5) 一起但获取类型url参数

URL: localhost:8080/SpringMVC/welcome?name=xyz
正文:名称=abc

@RequestMapping(method = RequestMethod.POST)
public String printWelcome(
    @RequestBody String body, 
    @RequestParam String name, Model model) 
{
    model.addAttribute("name", name);
    model.addAttribute("message", body);
    return "hello";
}
// name is 'xyz' and body is 'name=abc'

6) 与 5) 相同,但参数位置改变

@RequestMapping(method = RequestMethod.POST)
public String printWelcome(
    @RequestParam String name, 
    @RequestBody String body, Model model) 
{
    model.addAttribute("name", name);
    model.addAttribute("message", body);
    return "hello";
}
// name = 'xyz,abc' body is empty

有人可以解释这种行为吗?


The @RequestBodyjavadoc 指出

指示方法参数应绑定到主体的注释 的网络请求。

它使用的注册实例HttpMessageConverter将请求体反序列化为带注释的参数类型的对象。

And the @RequestParamjavadoc 指出

指示方法参数应绑定到的注释 网络请求参数。

  1. Spring将请求体绑定到带有注释的参数@RequestBody.

  2. Spring 将请求主体中的请求参数(url 编码的参数)绑定到您的方法参数。 Spring将使用参数的名称,即。name,映射参数。

  3. 参数按顺序解析。这@RequestBody首先被处理。春天将吞噬一切HttpServletRequest InputStream。当它尝试解决该问题时@RequestParam,默认情况下required,查询字符串中没有请求参数,也没有请求正文的剩余部分,即。没有什么。因此它会失败并返回 400,因为处理程序方法无法正确处理该请求。

  4. 处理程序@RequestParam首先采取行动,尽其所能地阅读HttpServletRequest InputStream映射请求参数,即。整个查询字符串/url 编码的参数。它这样做并获得价值abc映射到参数name。当处理程序为@RequestBody运行时,请求正文中没有任何内容,因此使用的参数是空字符串。

  5. 处理程序@RequestBody读取主体并将其绑定到参数。处理程序@RequestParam然后可以从 URL 查询字符串中获取请求参数。

  6. 处理程序@RequestParam从正文和 URL 查询字符串中读取。它通常会把它们放在一个Map,但由于参数的类型String,Spring将序列化Map作为逗号分隔值。处理程序@RequestBody然后,再一次,没有任何内容可以从正文中读取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MVC - 为什么不能一起使用@RequestBody和@RequestParam 的相关文章

随机推荐

  • LINQ Any 与 FirstOrDefault 的性能 != null

    我贡献的开源项目 OSP 代码中有多个地方必须确定集合中的元素是否满足特定条件 我见过LINQ表达式的使用Any lambda expression 在某些情况下和FirstOrDefault lambda expression null在
  • Ionic 隐藏导航栏而不是按钮

    我正在尝试寻找一种可能的方法来隐藏离子ion nav bar不隐藏ion nav barbuttons 我努力了 hide nav bar true 但它也隐藏了按钮 我已经搜索过并且也参考过this 但没有解决我的问题 问候 你只需要指定
  • 用于编辑源代码的 Docker 安装卷

    我的 Windows 系统上有 docker 设置 该应用程序的源代码位于C Application source地点 我希望这些信息在 docker 容器中可用 以便在开发过程中轻松更改代码 而无需重建映像 这就是我尝试过的 docker
  • 玩笑测试为 eventemitter 对象发出事件(express)

    试图从中获得灵感玩笑测试为 eventemitter 对象发出事件 http 没有解决我的痛苦express 假设有以下nodejs代码 server js const express require express const app e
  • 迁移到 Firebase Cloud Messaging:导入现有 Google 项目会对项目产生什么影响?

    In 设置 FCM它说 如果没有 请在 Firebase 控制台中创建一个 Firebase 项目 已经有一个了 如果您已经有一个现有的 Google 项目 与您的移动应用程序关联 单击导入 Google 项目 否则 单击 创建新项目 我有
  • 如何在 Spring Security 登录表单中进行额外验证?

    我想知道如何在 Spring Security 处理登录表单之前对其进行额外的验证 我正在考虑一些 LoginController LoginForm bean 但我不知道如何将它们组合在一起 如何配置它来工作 下面是我的 愿景 我搜索了一
  • 错误:rails 中的“不兼容的库版本”sqlite3-1.3.11

    我在 Ubuntu 系统 16 04 上工作 我的问题是每当我设置任何 Rails 项目并尝试运行rails s然后我收到 sqlite3 的 库版本不兼容 错误 如下所示 home jiggs rvm gems ruby 2 3 1 al
  • 字节中的位数是否等于 char 类型中的位数?

    C 标准有强制要求吗 是否存在一个字节中的位数不等于类型中的位数的平台char Yes Both are equal to CHAR BIT C标准定义CHAR BIT as 不是位字段 字节 的最小对象的位数 c99 明确表示 一个字节包
  • 如何获取Windows中当前交互式用户会话的数量?

    我正在编写一个 Windows 服务 它需要知道当前是否有任何用户登录在计算机上 到目前为止我已经尝试过Win32 LogonSession WMI 以及LsaEnumerateLogonSessions LsaGetLogonSessio
  • 在Python中通过strptime解析不带前导零的小时

    假设您有以下格式的时间 a 800 0 830 0 900 0 930 0 1000 0 1030 0 问题是缺少小时的前导零 例如00 30表示为30 08 00表示为800 and 00 00表示为2400 是否可以将此数据解析为tim
  • 如何计算并仅打印重复项?

    我知道如何遍历整个数组 但我只需要重复出现的次数 我处于初学者水平 所以只是循环和数组的基本使用 int array 12 23 22 0 43 545 4 55 43 12 0 999 87 for int i 0 i lt array
  • 了解LDR和STR吗?

    我正在使用 ARMSim 我猜它是一个 ARM 模拟器 并且我有这个演示程序 它基本上读取一个文本文件并打印文本文件中的整数 仅第一行 Start Open file for input LDR R0 InputFileName MOV R
  • 显示“android-feedback.com”库的对话框

    我正在按照这里给出的教程进行操作http www android feedback com library用于发送反馈 但我无法显示对话框onOptionsItemSelected Override public boolean onCre
  • 获取 Google Apps 脚本来授权 Fusion Table API

    我正在构建一个数据库 希望将其托管在 Fusion Table 中 并且正在开发一些用于与 Fusion API 交互的测试函数 我正在使用 Google Apps 脚本 并且严重依赖此代码的其他来源 我花了一天的大部分时间研究这个问题 但
  • C# 字节[]加密

    我有一个 Byte 字段 它是我需要加密的文件内容 没有什么特别或奇特的 只是足以确保下一个得到它的人不费吹灰之力就无法轻松解码它 我会使用 Net Framework 4 0 附带的加密 但我绝对不需要使文件比实际更大 我想过只是简单地反
  • 如何在 Windows Phone 8 中以编程方式锁定屏幕?

    我们可以使用下面的代码来防止屏幕锁定 PhoneApplicationService Current ApplicationIdleMode IdleDetectionMode Disabled and PhoneApplicationSe
  • Android 中 Tab 更改时更改菜单

    我的应用程序中有两个选项卡 我希望菜单根据选项卡进行更改 这是我所做的 TabHost tabHost tabHost getTabHost TabSpec photospec tabHost newTabSpec Photos photo
  • 无法在 XAML (Xamarin Forms) 中绑定静态属性

    我有一个静态类 Evp 它位于Models文件夹 它有一个Name字符串 带有 getter 和 setter 以及PropertyChangedEventHandler及其代码 public static event PropertyCh
  • Codeigniter URL 重写 .htaccess 在 CentOS 上不起作用

    我在文档根目录中创建了一个 htaccess 文件 var www html 重写 Codeigniter 的 URL 从所有页面的 URL 中删除 index php 例如更改网址自 http myhost index php contr
  • Spring MVC - 为什么不能一起使用@RequestBody和@RequestParam

    使用带有 Post 请求和 Content Type application x www form urlencoded 的 HTTP 开发客户端 1 仅 RequestBody 网址 本地主机 8080 SpringMVC 欢迎正文 名称