返回

SpringBoot 入门必知:用 @Valid 和 @Validated 注解实现参数校验

后端

使用 Spring Boot 的 @Valid 和 @Validated 实现严谨的数据校验

作为一名软件工程师,你是否曾被数据格式错误或表单提交不完整的问题所困扰?这些问题会导致程序报错,令人头疼不已。幸运的是,如果你使用 Spring Boot,那么 @Valid 和 @Validated 注解就是你的救星!本文将深入解析这两个注解,帮助你轻松实现参数校验,让你的代码更加健壮可靠。

@Valid 与 @Validated:参数校验利器

@Valid

@Valid 注解主要用于方法参数上,它表示该参数需要进行校验。你可以将 @Valid 注解添加到控制器的任何方法参数上,SpringBoot 就会自动对其进行校验。如果校验失败,SpringBoot 会抛出 MethodArgumentNotValidException 异常。

@Validated

@Validated 注解则用于类或接口上,它表示该类或接口的所有方法参数都需要进行校验。你可以将 @Validated 注解添加到控制器类或接口上,SpringBoot 就会自动对该类或接口的所有方法参数进行校验。同样,如果校验失败,SpringBoot 也会抛出 MethodArgumentNotValidException 异常。

自定义全局异常处理

为了统一处理 MethodArgumentNotValidException 异常并返回友好的错误信息,你可以自定义一个全局异常处理类。创建一个类继承 SpringBoot 提供的 ResponseEntityExceptionHandler 类,并重写 handleMethodArgumentNotValid 方法即可实现自定义异常处理。

在 handleMethodArgumentNotValid 方法中,你可以获取校验失败的错误信息,并返回一个包含错误信息的 JSON 响应。

代码示例

以下是一个示例代码,演示如何使用 @Valid 和 @Validated 以及自定义全局异常处理:

@RestController
@Validated
public class UserController {

    @PostMapping("/user")
    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
        // 校验通过,保存用户
        return ResponseEntity.ok("User created successfully.");
    }
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // 获取校验失败的错误信息
        List<String> errors = ex.getBindingResult().getAllErrors().stream()
                .map(ObjectError::getDefaultMessage)
                .collect(Collectors.toList());

        // 返回包含错误信息的 JSON 响应
        return ResponseEntity.badRequest().body(errors);
    }
}

结语:数据校验,项目基石

数据校验是项目开发中至关重要的一环。通过使用 @Valid 和 @Validated 注解,你可以确保数据在进入系统之前就符合预期,避免各种潜在的问题。而自定义全局异常处理则可以让你统一处理校验失败异常,返回友好的错误信息。

掌握这些技术,将大大提升你的 SpringBoot 项目的健壮性,让你的程序更加可靠、高效。

常见问题解答

  1. 为什么使用 @Valid 和 @Validated?
    答:为了避免因数据格式错误或表单提交不完整而导致的程序报错,从而提高代码健壮性。

  2. @Valid 和 @Validated 有什么区别?
    答:@Valid 用于方法参数,而 @Validated 用于类或接口,表示该类或接口的所有方法参数都需要校验。

  3. 如何自定义全局异常处理?
    答:继承 ResponseEntityExceptionHandler 类,并重写 handleMethodArgumentNotValid 方法。

  4. 代码示例中使用了哪些注解?
    答:@Valid、@Validated、@PostMapping、@RequestBody、@ResponseStatus、@ExceptionHandler。

  5. 数据校验还有哪些其他方式?
    答:使用 Bean Validation 框架、正则表达式、第三方库。