1.概览
在大多数Java应用程序中,我们需要对用户的输入进行校验,确保输入的数据符合预期的定义和限制。Jakarta Bean Validation 2.0是一种十分强大的对JavaBean校验的框架。在这篇文章中,我们将了解如何使用它,并将它与SpringBoot集成。
2.使用
(1) 创建一个springboot项目,可以使用idea快速构建springboot项目
(2) 在pom.xml文件中引入akarta Bean Validation 2.0
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
(3) 从springboot2.3x之后需要显示的引入spring-boot-starter-validation
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
3.一个简单javabean类
项目的依赖添加完毕后,我们需要定义一个简单的实体类
@TableName("database_user")
public class UserEntity {
@TableId
private long id;
@NotBlank(message = "Name is required")
private String name;
@NotBlank(message = "Email is required")
private String email;
//constructor/tostring/setter/getter
}
我们的这个UserEntity实现十分简陋,但它主要展示了使用BeanValidation注解来约束name和email字段。为了简化,我们仅仅使用@NotBlank来约束目标字段。我们可以使用message属性来只当错误消息。
因此,在SpringBoot校验实体类时,被约束的字段不能为null并且删除空格后的长度要大于零
除了 @NotBlank之外,Bean Validation 还提供了许多其他的约束。并且允许将多个校验规则应用到同一个字段上。更多的校验注解请参考Jakarta Bean Validation
4.实现一个REST控制器
下面时REST控制器的实现
@RestController
public class userController {
@PostMapping("/users")
ResponseEntity<String> addUser(@Valid @RequestBody UserEntity user) {
return ResponseEntity.ok("User is valid");
}
}
在Spring REST context中addUser()方法相当标准。
当然更重要的是@Valid注解的使用。
当 Spring Boot 发现一个用 @Valid 注解修饰的参数时,它会自动引导默认的 JSR 380 实现,即Hibernate Validator,并验证该参数。
当目标参数不能通过校验时,SpringBoot会抛出MethodArgumentNotValidException
5.@ExceptionHandler注解
@ExceptionHandler允许我们使用一个方法处理指定类型的异常。
因此我们可以使用它来处理校验错误。
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex)
{
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
我们将MethodArgumentNotValidException异常指定为要处理的异常,因此,当指定的User实体没能通过校验时,Spring Boot会自动调用这个方法。
这个方法里,将每个字段的名字和不合法字段的错误消息提示放在一个Map集合里。接下来,它将 Map 作为 JSON 表示形式发送回客户端,以便进一步处理。
6.测试REST控制器
我们可以使用postman来测试
我们使用POST请求访问localhost:8080/users端口,并且使用合法的User对象时将返回字符串" User is valid"
同样的,我们POST请求访问相同端口,但是使用的是name和email是一个空串,将返回如下结果。
7.总结
在这篇文章中我们学习了在Spring Boot中执行基础的校验。