SpringBoot接收参数所有方式总结

 更新时间:2024年07月04日 09:02:42   作者:鞋尖的灰尘  
这篇文章主要介绍了SpringBoot接收参数所有方式总结,文中通过代码示例和图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

方法形参接收参数【不推荐】

  • 此场景适用于请求参数比较少的情况
  • Springboot3.2会异常报错: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
  • 解决方案
@RequestMapping("/test1")
public String test1(String name,String age) {
    return String.format("name:%s,age:%s", name, age);
}

以实体类接受参数 【不推荐】

  • 此场景适用于请求参数比较多的情况
  @Getter
  @Setter
  public static class DTO {
      private String name;
​
      private Integer age;
  }
​
  @RequestMapping("/test2")
  public String test2(DTO request) {
      return String.format("name:%s,age:%s", request.getName(), request.getAge());
  }

以形参和实体类接受参数 【不推荐】

  • Springboot3.2会异常报错: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.
  • 解决方案
  @RequestMapping("/test3")
  public String test3(DTO requestDto,String sex) {
      return String.format("name:%s,age:%s,sex:%s", requestDto.getName(), requestDto.getAge(),sex);
  }

上述三种接受参数的方式,只能用来获取query-params,form-data,x-www-form-urlencoded格式数据

@PathVariable注解

@PathVariable 注解可用于处理请求 URI 映射中的模板变量,并将其绑定到 Controller 方法参数

  • 使用 @PathVariable 注解来提取 URI 的模板部分,该部分由变量 {name} 表示
  @RequestMapping("/test4/{name}/{age}")
  public String test4(@PathVariable("name") String name,@PathVariable("age") Integer age) {
      return String.format("name:%s,age:%s", name, age);
  }

  • 指定路径变量名

    由于方法参数和路径变量的名称相同,可以不用主动设置模板路径变量的名称。如果路径变量名不同,可以在 @PathVariable 注解的参数中指定

@GetMapping("/test5/{name}")
public String test4(@PathVariable("name") String id) {
    return String.format("name:%s",id);
}
  • 单个请求中的多个路径变量
@GetMapping("/test5/{name}/{id}")
public String test5(@PathVariable(value = "name") String name,@PathVariable(value = "id") String id) {
    return String.format("name:%s id:%s", name, id);
}
  • java.util.Map<String, String> 类型的方法参数来处理多个 `@PathVariable 参数 [不推荐]
@GetMapping("/test5/{name}/{id}")
public String test6(@PathVariable Map<String,String> request) {
    return JSON.toJSONString(request);
}
  • 可选择的路径变量
  @RequestMapping(value = {"/test6","test6/{name}/{age}"})
  public String test6(@PathVariable("name") String name,@PathVariable("age") Integer age) {
      return String.format("name:%s,age:%s", name, age);
  }

咋一看,上述 Controller 应该可以处理 /test6/test6/smile/32 请求。但是,由于 @PathVariables 所注解的方法参数默认为必选参数,因此它无法处理 /api/employeeswithrequired 请求

有三种不同的方法来处理这个问题

设置required为false

  @RequestMapping(value = {"/test6","test6/{name}/{age}"})
  public String test6(@PathVariable(value = "name",required = false) String name,@PathVariable(value = "age",required = false) Integer age) {
      return String.format("name:%s,age:%s", name, age);
  }

使用 java.util.Optional

  @RequestMapping(value = {"/test7","test7/{name}/{age}"})
  public String test7(@PathVariable Optional<String> name,@PathVariable Optional<String> age) {
      return String.format("name:%s,age:%s", name.orElse("null"), age.orElse("null"));
  }

使用 Map<String, String> 类型的方法参数 [不推荐]

  @RequestMapping(value = {"/test8","test8/{name}/{age}"})
  public String test8(@PathVariable Map<String,String> request) {
      return String.format("name:%s,age:%s", request.get("name"), request.get("age"));
  }

@RequestParam

可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至是多个参数

  • 指定请求参数名称

    如果变量名称和参数名称不同,可以使用 name 属性配置 @RequestParam 名称:

  @RequestMapping("/test9")
  public String test9(@RequestParam("name") String name,@RequestParam("age") Integer age) {
      return String.format("name:%s,age:%s", name, age);
​
  }

也可以使用 @RequestParam(value = "name") 或直接使用 @RequestParam("name")

  • 可选的请求参数

    使用 @RequestParam 注解的方法参数默认为必填参数。这意味着,如果请求中没有该参数,就会返回 400 错误

    • 可以使用 required 属性将 @RequestParam 配置为可选参数:
  @RequestMapping("/test10")
  public String test10(@RequestParam(value = "name",required = false) String name,@RequestParam(value = "age",required = false) Integer age) {
      return String.format("name:%s,age:%s", name, age);
  }

如果没有指定参数,方法参数将绑定为 null

  • 使用 Java 8 Optional

  @RequestMapping("/test11")
  public String test11(@RequestParam(value = "name") Optional<String> name,@RequestParam(value = "age") Optional<Integer> age) {
      return String.format("name:%s,age:%s", name.orElse(null), age.orElse(null));
  }
  • 在这种情况下,不需要指定 required 属性。

    如果没有提供请求参数,则使用默认值:

请求参数的默认值

还可以使用 defaultValue 属性为 @RequestParam 设置默认值

  @RequestMapping("/test12")
  public String test12(@RequestParam(value = "name",defaultValue = "smile") Optional<String> name,@RequestParam(value = "age") Optional<Integer> age) {
      return String.format("name:%s,age:%s", name.orElse(null), age.orElse(null));
  }

与 required=false 类似,用户不再需要提供参数:

注意,当设置 defaultValue 属性时,required 会被被设置为 false

映射所有参数

还可以使用 Map 来封装多个参数,而无需定义它们的名称(name)或数量:

  @RequestMapping("/test13")
  public String test13(@RequestParam Map<String,String> request) {
      return String.format("name:%s,age:%s", request.get("name"), request.get("age"));
  }

多值参数(列表/数组)

一个 @RequestParam 可以有多个值:

  @RequestMapping("/test14")
  public String test14(@RequestParam("id") List<String> idList) {
      return String.format(JSON.toJSONString(idList));
  }

@RequestBody

将HttpRequest主体映射到方法上实体属性中

以字符串的方式接收 body 的数据

  @PostMapping("/test15")
  public String test15(@RequestBody String requestString) {
      return requestString;
  }

以Map的方式接收body 的数据

  @RequestMapping("/test16")
  public String test16(@RequestBody Map<String,Object> requestMap) {
      return String.format(JSON.toJSONString(requestMap));
  }

以实体类的方式接收body 的数据 【最常用】

  @RequestMapping("/test17")
  public String test17(@RequestBody DTO requestDto) {
      return String.format(JSON.toJSONString(requestDto));
  }

当body中没有任何数据传递时,会抛出异常:Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.fs.smile.home.controller.RequestController.test16(java.util.Map<java.lang.String, java.lang.Object>)]这种情况,应该如何解决

可以使用 required 属性将 @RequestBody 配置为可选参数

  @RequestMapping("/test17")
  public String test17(@RequestBody DTO requestDto) {
      return String.format(JSON.toJSONString(requestDto));
  }

使用 Java 8 Optional

在这种情况下,不需要指定 required 属性

  @RequestMapping("/test18")
  public String test18(@RequestBody Optional<Map<String,Object> > requestMap) {
      return String.format(JSON.toJSONString(requestMap.orElse(null)));
  }

@RequestBody接收数据的格式要求

  • Content-Type: application/json
  • Content-Type: application/xml
  • Content-Type: text/plain
  • Content-Type: application/octet-stream

根据不同的Content-Type等情况,Spring-MVC会采取不同的HttpMessageConverter实现来进行信息转换解析。@RequestBody不能用来处理application/x-www-form-urlencodedmultipart/form-data 格式的请求数据,如果尝试使用 @RequestBody 来处理这类请求,通常会遇到 415 Unsupported Media Type 异常。要处理这两种格式的数据,应该使用 @RequestParam@ModelAttribute 注解

@RequestHeader

RequestHeader主要用来获取请求当中的请求头

  • 获取单个header属性
  @RequestMapping("/test20")
  public String test20(@RequestHeader("name") String name,@RequestHeader("age") Integer age) {
      return String.format("name:%s,age:%s", name, age);
  }

当header中不存在该参数时,系统会抛出400的异常,可以参考@PathVariable的处理方案

获取所有header属性

@RequestMapping("/test21")
public String test21(@RequestHeader Map<String,String> headers) {
    return String.format("name:%s,age:%s", headers.get("name"), headers.get("age"));
}

获取header对象

@RequestMapping("/test22")
public String test22(@RequestHeader HttpHeaders headers) {
    return String.format("name:%s,age:%s", headers.get("name"), headers.get("age"));
}

以上就是SpringBoot接受参数所有方式总结的详细内容,更多关于SpringBoot接受参数的资料请关注脚本之家其它相关文章!

相关文章

  • Java编程环境搭建和变量基本使用图文教程

    Java编程环境搭建和变量基本使用图文教程

    这篇文章主要介绍了Java编程环境搭建和变量基本使用,结合图文形式详细分析了java编程语言环境搭建、配置、变量、注释的基本使用方法,需要的朋友可以参考下
    2020-02-02
  • 如果你想写自己的Benchmark框架(推荐)

    如果你想写自己的Benchmark框架(推荐)

    这篇文章主要介绍了如果你想写自己的Benchmark框架,本文通过给大家分享八条军规,帮助大家理解,需要的朋友可以参考下
    2020-07-07
  • SpringBoot Redis用注释实现接口限流详解

    SpringBoot Redis用注释实现接口限流详解

    Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了~今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 项目涉及到这个知识点了,我就拎出来和大家聊聊这个话题
    2022-07-07
  • SpringData JPA Mongodb查询部分字段问题

    SpringData JPA Mongodb查询部分字段问题

    这篇文章主要介绍了SpringData JPA Mongodb查询部分字段问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java原生动态生成验证码

    java原生动态生成验证码

    这篇文章主要为大家详细介绍了java原生动态生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • Java网络编程基础教程之Socket入门实例

    Java网络编程基础教程之Socket入门实例

    这篇文章主要介绍了Java网络编程基础教程之Socket入门实例,本文讲解了创建Socket、Socket发送数据、Socket读取数据、关闭Socket等内容,都是最基础的知识点,需要的朋友可以参考下
    2014-09-09
  • HttpClient实现调用外部项目接口工具类的示例

    HttpClient实现调用外部项目接口工具类的示例

    下面小编就为大家带来一篇HttpClient实现调用外部项目接口工具类的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Maven 打包项目到私服 (deploy)的配置方法

    Maven 打包项目到私服 (deploy)的配置方法

    这篇文章主要介绍了Maven 打包项目到私服 (deploy)的配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Spring Boot之Validation自定义实现方式的总结

    Spring Boot之Validation自定义实现方式的总结

    这篇文章主要介绍了Spring Boot之Validation自定义实现方式的总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java开发之手把手教你搭建企业级工程SSM框架

    Java开发之手把手教你搭建企业级工程SSM框架

    这篇文章主要为大家介绍Java教程中搭建企业级工程SSM框架,手把手的过程操作,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09

最新评论