Java Bean Validation API在springboot中,实际开发怎么运用

ops/2024/10/19 15:30:28/

在Spring Boot中,Java Bean Validation API(JSR 380)的实际运用非常广泛,主要用于对用户输入的数据进行验证。以下是一些关键点和示例,展示如何在Spring Boot应用程序中使用Java Bean Validation API:

### 1. 添加依赖
首先,确保你的Spring Boot项目中已经添加了`spring-boot-starter-validation`依赖。这个启动器会自动配置Hibernate Validator作为Bean Validation的实现。

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

### 2. 使用注解
在模型类(DTO、Entity等)上使用标准的Bean Validation注解,例如`@NotNull`、`@Size`、`@Email`等,来定义字段的验证规则。

```java
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;

public class UserRequest {

    @NotNull(message = "Username is required")
    @Size(min = 3, max = 50)
    private String username;

    @Email(message = "Email should be valid")
    private String email;

    // Getters and setters
}
```

### 3. 验证请求参数
在控制器方法中,使用`@Valid`或`@Validated`注解来触发验证逻辑。如果验证失败,Spring Boot将自动抛出`MethodArgumentNotValidException`异常。

```java
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;

@RestController
public class UserController {

    @PostMapping("/users")
    public ResponseEntity<?> createUser(@Valid @RequestBody UserRequest userRequest) {
        // 保存用户逻辑
        return ResponseEntity.ok("User created successfully");
    }
}
```

### 4. 自定义验证消息
你可以在`application.properties`或`application.yml`中定义自定义的验证错误消息,以支持国际化。

```properties
# application.properties
user.username.size=Username should have between {min} and {max} characters
user.email.invalid=Email is not valid
```

### 5. 异常处理
通过实现`ControllerAdvice`接口,全局处理`MethodArgumentNotValidException`异常,返回统一的错误响应。

```java
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleValidationExceptions(MethodArgumentNotValidException ex) {
        // 构建错误响应体
        Map<String, String> errors = ex.getBindingResult().getFieldErrors().stream()
                .collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }
}
```

### 6. 组验证
使用组(Groups)的概念来定义不同的验证场景,例如创建和更新操作可能有不同的验证需求。

```java
public class UserRequest {

    @NotNull(message = "Username is required", groups = {CreateGroup.class, UpdateGroup.class})
    @Size(min = 3, max = 50, groups = {CreateGroup.class})
    private String username;

    // 使用@Validated注解的组参数
    public void validateForCreate(@Validated(CreateGroup.class) UserRequest userRequest) {
        // 创建用户逻辑
    }
}
```

### 7. 嵌套验证
对嵌套对象进行验证,确保关联对象的字段同样满足验证条件。

```java
public class UserRequest {

    @Valid
    private Address address;

    // Address类的定义和验证
}
```

通过这些步骤,你可以在Spring Boot应用程序中充分利用Java Bean Validation API来确保数据的合法性和正确性。这不仅可以提高应用程序的健壮性,还可以提升用户体验,通过及时的反馈来指导用户输入正确的数据。
 


http://www.ppmy.cn/ops/90073.html

相关文章

Konva 实现指示框

Konva 实现指示框 还是先上效果图 封装 封装成了hooks&#xff0c;可以在vue或者react中使用&#xff0c;也是一份学习资料 代码 从左到右的渐变背景和边框 我采用的是线性渐变&#xff0c;通过createLinearGradient传递两个像素点分别为开始像素点和结束像素点&#xff0c…

Floyd求最短路

给定一个 nn 个点 mm 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 再给定 kk 个询问&#xff0c;每个询问包含两个整数 xx 和 yy&#xff0c;表示查询从点 xx 到点 yy 的最短距离&#xff0c;如果路径不存在&#xff0c;则输出 impossible。…

学习大数据DAY28 python基础语法

目录 思维导图 数据类型 变量 输入 输出 运算符 bool 类型 常量变量拼接 流程控制 选择结构 if 循环结构 while 及 for 循环 字符串(String) 字符串的索引截取 索引 1.len() #获取字符串长度 2.str.find()字符查找 ,找到返回索引&#xff0c;没找到返回-1 3.st…

LeetCode 139. 单词拆分

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。 组队打卡&#xff0c;更多解法等你一起来参与哦&#xff01; LeetCode 139. 单词拆分&#xff0c;难度中等。 DP 解题思路&#xff1a; 使用 Set 来存储字典中的单词&#xff0c;这样可以在常数时间内检查一…

C++数组全面讲解

文章目录 数组介绍数组的特点数组的优缺点数组和其他数据结构的比较 静态数组与动态数组的详细讲解一、静态数组1. 一维数组声明与初始化注意事项特点 2. 二维数组声明与初始化注意事项特点 3. 三维数组声明与初始化注意事项特点 二、动态数组1. 一维数组声明与初始化注意事项特…

Element UI 如何配置文件来设置全局的语言选项。

Element UI 允许你通过配置文件来设置全局的语言选项&#xff0c;这样你可以方便地切换组件的语言。以下是如何配置 Element UI 以设置全局语言选项的步骤&#xff1a; 1. 安装 Element UI 确保你已经安装了 Element UI。 npm install element-ui --save2. 引入语言包 Elem…

AWS域名注册:AWS 是否可以注册HK域名?

AWS&#xff08;Amazon Web Services&#xff09;本身并不直接提供域名注册服务&#xff0c;但它通过其服务Amazon Route 53提供域名注册功能&#xff0c;九河云来和你详细说说域名注册的一些事项吧。通过Amazon Route 53&#xff0c;你可以注册各种顶级域名&#xff08;TLD&am…

机器学习用python还是R,哪个更好?

选择使用Python还是R进行机器学习取决于多个因素,包括您的具体需求、项目要求、个人偏好以及团队的技能水平。以下是一些关键点,可以帮助您做出决定: Python的优势 广泛使用:Python是目前最流行的编程语言之一,特别是在数据科学和机器学习领域。它有一个庞大的社区和丰富…