背景:
日常工作中,我们开发接口的时候,都会接触到参数校验、异常处理、封装接口返回。 如果每个后端开发在进行参数校验、异常处理的时候都是各写各的, 代码就不优雅、不容易维护。
在Spring项目开发中,进行统一的参数校验是一种常见需求,以确保进入控制器(Controller)方法的数据是有效和符合预期的。Spring框架提供了强大的参数校验支持,主要依赖于JSR-303/JSR-380 Bean Validation API,以及Spring的**@Valid或@Validated**注解。下面是进行统一参数校验的基本步骤和一些建议:
确保项目中包含了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>
在你的数据模型(通常是DTOs)上使用Bean Validation提供的注解来定义校验规则,例如**@NotNull**, @Size, **@Email**等。
javaCopy code
public class UserDto {
@NotNull
private String name;
@Email
private String email;
// getters and setters
}
@Valid或@Validated在控制器方法的参数上使用**@Valid或Spring特有的@Validated注解,以触发校验逻辑。如果校验失败,将抛出一个MethodArgumentNotValidException**异常。
javaCopy code
@PostMapping("/users")
public ResponseEntity<Void> createUser(@Valid @RequestBody UserDto userDto) {
// 业务逻辑...
return ResponseEntity.ok().build();
}
通过**@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);
}
}
如果内置的校验注解不能满足你的需求,你可以通过创建自定义注解和对应的校验器来实现复杂的校验逻辑。
通过遵循上述步骤,你可以在Spring项目中实现统一且强大的参数校验逻辑,提高数据的准确性和应用的健壮性。