SpringBoot 如何使用 @RequestBody 进行数据校验

SpringBoot 如何使用 @RequestBody 进行数据校验

在 Web 开发中,前台向后台发送数据是非常常见的场景。而在 SpringBoot 框架中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。但是,接收到的数据并不一定是符合要求的,因此我们需要对其进行数据校验。本文将介绍如何在 SpringBoot 中使用 @RequestBody 进行数据校验。

什么是 @RequestBody

@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 Java 对象。它的作用是将 HTTP 请求正文中的 JSON 字符串绑定到相应的 Java 对象上。在 SpringBoot 中,我们通常使用 @RequestBody 注解来接收前台发送的 JSON 数据,并将其转化为 Java 对象。

如何使用 @RequestBody 进行数据校验

在 SpringBoot 中,我们可以使用 JSR-303 规范提供的注解来对 Java 对象进行数据校验。JSR-303 是 Java EE 6 中引入的 Bean Validation 规范,它提供了一套用于数据校验的注解。

在 SpringBoot 中使用 JSR-303 注解进行数据校验的步骤如下:

  1. 引入相关依赖

在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-validationartifactId>
dependency>
  1. 在 Java Bean 中添加校验注解

在 Java Bean 中添加校验注解,例如:

public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度不能小于 6 位")
    private String password;

    // 省略 getter 和 setter 方法
}
  1. 在 Controller 方法中添加 @Validated 和 @RequestBody 注解

在 Controller 方法中添加 @Validated 和 @RequestBody 注解,例如:

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

在上述代码中,@Validated 注解用于启用数据校验,@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 User 对象。

  1. 处理校验结果

如果数据校验失败,会抛出 MethodArgumentNotValidException 异常。我们可以在 ControllerAdvice 中捕获此异常,并返回校验结果。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        return Result.error(String.join(",", errorMessages));
    }
}

在上述代码中,我们使用 @RestControllerAdvice 注解声明一个全局异常处理类,其中 @ExceptionHandler 注解用于捕获 MethodArgumentNotValidException 异常,并处理校验结果,最终返回一个 Result 对象。

完整代码示例

@Data
public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度不能小于 6 位")
    private String password;
}

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        return Result.error以上示例代码可能有些不完整,我们来完整展示一下如何使用 @RequestBody 进行数据校验的完整代码示例。

### 引入依赖

在 pom.xml 文件中添加以下依赖:

```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

编写实体类

@Data
public class User {
    @NotNull(message = "用户名不能为空")
    private String username;

    @NotNull(message = "密码不能为空")
    @Size(min = 6, message = "密码长度不能小于 6 位")
    private String password;
}

编写 Controller

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    public Result addUser(@Validated @RequestBody User user) {
        // 处理添加用户的逻辑
    }
}

在上述代码中,@Validated 注解用于启用数据校验,@RequestBody 注解用于接收前台发送的 JSON 数据,并将其转化为 User 对象。

编写全局异常处理类

如果数据校验失败,会抛出 MethodArgumentNotValidException 异常。我们可以在 ControllerAdvice 中捕获此异常,并返回校验结果。

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<String> errorMessages = new ArrayList<>();
        for (ObjectError error : allErrors) {
            errorMessages.add(error.getDefaultMessage());
        }
        return Result.error(String.join(",", errorMessages));
    }
}

在上述代码中,我们使用 @RestControllerAdvice 注解声明一个全局异常处理类,其中 @ExceptionHandler 注解用于捕获 MethodArgumentNotValidException 异常,并处理校验结果,最终返回一个 Result 对象。

编写启动类

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void addUserTest() {
        User user = new User();
        user.setUsername("test");
        user.setPassword("12345");
        ResponseEntity<Result> responseEntity = restTemplate.postForEntity("/user/add", user, Result.class);
        Assert.assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
        Result result = responseEntity.getBody();
        Assert.assertEquals(ResultStatus.FAIL.getCode(), result.getStatus());
        Assert.assertEquals("密码长度不能小于 6 位", result.getMessage());
    }
}

在上述代码中,我们使用 SpringBoot 自带的 TestRestTemplate 对象来模拟发送 POST 请求,并验证数据校验的结果是否符合预期。

总结

在 SpringBoot 中使用 @RequestBody 进行数据校验,可以有效地提高代码的健壮性和可靠性。通过 JSR-303 提供的注解,我们可以轻松地对 Java 对象进行数据校验,并在数据校验失败时返回相应的错误信息。希望本文能够对大家在 SpringBoot 中使用 @RequestBody 进行数据校验有所帮助。

你可能感兴趣的:(Java,教程,spring,boot,java,spring)