【spring】@RequestBody注解学习

发布于:2024-05-22 ⋅ 阅读:(147) ⋅ 点赞:(0)

@RequestBody介绍

@RequestBody 是 Spring Framework 中的一个注解,用于将 HTTP 请求的正文绑定到处理方法的参数上。这个注解通常用于处理 POST 或 PUT 请求,这些请求通常包含 JSON 或 XML 格式的数据。

@RequestBody 将 HTTP 请求的正文内容转换成指定的 Java 类型。

@RequestBody源码

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {


	boolean required() default true;

}
源代码截图

@RequestBody属性介绍

required: 这是一个布尔类型的属性,默认值为true。当设置为true时,表示请求体必须存在且非空,否则Spring MVC会在处理请求时抛出异常(通常是HttpMessageNotReadableException)。如果设置为false,则表示请求体可以为空,此时如果请求体确实为空,Spring会将该参数的值设为null而不是抛出异常。

@RequestBody注解使用场景

在处理 POST、PUT、PATCH 等请求时,客户端通常会发送 JSON、XML 等格式的数据,使用 @RequestBody 可以将这些数据自动转换为 Java 对象。

@RequestBody示例代码

​
public ResponseEntity<?> handleRequest(@RequestBody(required = false) MyObject data) {
    // ...
}

​

与 @RequestBody 一起使用的参数可以包含其他注解

  1. @Valid 或 @Validated:

    • 这些注解用于启用数据验证。当你将它们放在使用 @RequestBody 的参数上时,Spring 会根据 Java Bean Validation 规范对传入的数据进行验证。
      @PostMapping("/users")
      public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
          // 处理用户创建逻辑
          return ResponseEntity.ok(user);
      }
      @PostMapping("/users")
      public ResponseEntity<User> createUser(@Validated @RequestBody User user) {
          // 处理用户创建逻辑
          return ResponseEntity.ok(user);
      }

  2. @RequestParam:

    • 虽然 @RequestParam 主要用于查询参数,但也可以与 @RequestBody 一起使用,以指定默认值或要求参数必须。
      @PostMapping("/users")
      public ResponseEntity<?> createUser(@RequestParam("active") boolean active, @RequestBody User user) {
      // 使用查询参数设置User对象的状态
          user.setActive(active); 
          // 继续处理用户创建逻辑
          return ResponseEntity.ok(user);
      }

      @RequestParam("active") 用于从URL中获取名为active的查询参数,并将其绑定到方法参数active上。@RequestBody User user 则用于将请求体中的JSON数据绑定到User对象上。

  3. @RequestPart:

    • 这个注解用于处理多部分请求(如文件上传),可以与 @RequestBody 结合使用来分别处理文件部分和其他请求体数据。
      @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
      public ResponseEntity<String> handleComplexUpload(
          @RequestPart("file") MultipartFile file,
          @RequestBody UserDetails userDetails) {
          // 处理文件上传和用户详情逻辑
          return ResponseEntity.ok("Complex upload handled successfully");
      }

      file 是从多部分请求的 "file" 部分提取的,而 UserDetails 对象是从请求体中提取的。

  4. @PathVariable:

    • 尽管 @PathVariable 用于 URI 模板变量,但如果你想从请求体中获取路径变量(这在技术上不常见),你可以将它与 @RequestBody 结合使用。
      @PutMapping("/users/{userId}")
      public ResponseEntity<?> updateUser(@PathVariable("userId") Long userId, @RequestBody User user) {
          if (user.getId() != userId) {
              // 检查ID是否匹配
              return ResponseEntity.badRequest().build(); 
          }
          // 更新用户信息
          return ResponseEntity.ok(user);
      }

      @PathVariable("userId") 用于从URL路径中提取用户ID,并将其绑定到方法参数userId上。@RequestBody User user 用于将请求体中的更新数据绑定到User对象上。

  5. @ControllerAdvice 或 @RestControllerAdvice:

    • 这些注解用于全局异常处理或数据绑定自定义,可以与 @RequestBody 配合使用,以全局方式处理请求体的绑定问题。
  6. @RequestBody 可以与自定义注解一起使用,以实现更高级的绑定特性,如自定义序列化器或反序列器。

  7. @Profile:

    • 虽然 @Profile 主要用于配置类或方法,指示它们应该在哪些环境上下文中被激活,但它可以间接影响 @RequestBody 的行为,因为不同的环境可能配置了不同的消息转换器。
  8. @RequestBody 可以与 required 属性一起使用,虽然这不是一个注解,但在 Spring 的数据绑定中是一个重要的概念。你可以设置 required = false 来指示请求体是可选的。

  9. @RequestBody 可以与 consumes 属性一起使用,虽然这不是一个注解,但它可以指定处理请求体的 MIME 类型。例如,你可以在方法上使用 @RequestMapping 并设置 consumes = "application/json" 来指定只处理 JSON 类型的请求体。

  10. @Target@Retention:

    • 虽然这些不是直接与 @RequestBody 一起使用的注解,但它们定义了 @RequestBody 的使用范围和保留策略。@Target 指定了注解可以应用的地方(如方法参数),@Retention 指定了注解的保留时间(如运行时)。





网站公告

今日签到

点亮在社区的每一天
去签到