背景:

日常工作中,我们开发接口的时候,都会接触到参数校验、异常处理、封装接口返回。 如果每个后端开发在进行参数校验、异常处理的时候都是各写各的, 代码就不优雅、不容易维护。

统一参数校验

在Spring项目开发中,进行统一的参数校验是一种常见需求,以确保进入控制器(Controller)方法的数据是有效和符合预期的。Spring框架提供了强大的参数校验支持,主要依赖于JSR-303/JSR-380 Bean Validation API,以及Spring的**@Valid@Validated**注解。下面是进行统一参数校验的基本步骤和一些建议:

1. 添加依赖

确保项目中包含了Bean Validation API的实现,比如Hibernate Validator。如果你使用的是Spring Boot,通常会自动配置。如果不是,你可能需要手动添加相关依赖。

xmlCopy code
<!-- 以Maven为例,添加Hibernate Validator依赖 -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>

2. 使用标准的Bean Validation注解

在你的数据模型(通常是DTOs)上使用Bean Validation提供的注解来定义校验规则,例如**@NotNull**, @Size, **@Email**等。

javaCopy code
public class UserDto {

    @NotNull
    private String name;

    @Email
    private String email;

    // getters and setters
}

3. 在Controller方法中应用@Valid@Validated

在控制器方法的参数上使用**@Valid或Spring特有的@Validated注解,以触发校验逻辑。如果校验失败,将抛出一个MethodArgumentNotValidException**异常。

javaCopy code
@PostMapping("/users")
public ResponseEntity<Void> createUser(@Valid @RequestBody UserDto userDto) {
    // 业务逻辑...
    return ResponseEntity.ok().build();
}

4. 全局异常处理

通过**@ControllerAdvice@ExceptionHandler注解定义一个全局异常处理器,用来捕获和处理MethodArgumentNotValidException**,以及其他可能的校验异常。这样,你可以返回一个统一的错误响应格式给客户端。

javaCopy code
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<List<String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult()
            .getFieldErrors()
            .stream()
            .map(error -> error.getField() + ": " + error.getDefaultMessage())
            .collect(Collectors.toList());

        return ResponseEntity.badRequest().body(errors);
    }
}

5. 自定义校验注解

如果内置的校验注解不能满足你的需求,你可以通过创建自定义注解和对应的校验器来实现复杂的校验逻辑。

通过遵循上述步骤,你可以在Spring项目中实现统一且强大的参数校验逻辑,提高数据的准确性和应用的健壮性。