# validation_project **Repository Path**: uzongn/validation_demo ## Basic Information - **Project Name**: validation_project - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-18 - **Last Updated**: 2024-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Hibernate Validator 示例项目 这个项目展示了 Hibernate Validator 框架中各种验证注解的使用方法。 ## 项目结构 ``` validation-project/ ├── src/main/java/ │ └── com/example/ │ ├── ValidationDemoApplication.java │ ├── controller/ │ │ └── UserController.java │ └── model/ │ └── User.java └── pom.xml ``` ## 验证注解说明 ### 1. 空值检查注解 - `@NotNull`: 验证对象不能为 null - `@NotEmpty`: 验证字符串或集合不能为空(长度大于0) - `@NotBlank`: 验证字符串不能为空白字符 ### 2. 字符串相关注解 - `@Length(min=, max=)`: 验证字符串长度范围 - `@Pattern(regexp="")`: 验证字符串是否匹配正则表达式 - `@Email`: 验证是否是合法的电子邮件地址 ### 3. 数值相关注解 - `@Min(value)`: 验证数字是否大于等于指定值 - `@Max(value)`: 验证数字是否小于等于指定值 - `@Range(min=, max=)`: 验证数字是否在指定范围内 - `@Digits(integer=, fraction=)`: 验证数字的整数位和小数位的位数 - `@DecimalMin`: 验证数字的最小值 - `@DecimalMax`: 验证数字的最大值 ### 4. 时间相关注解 - `@Past`: 验证日期是否在当前时间之前 - `@Future`: 验证日期是否在当前时间之后 ### 5. 集合相关注解 - `@Size(min=, max=)`: 验证集合的大小范围 ### 6. 其他注解 - `@URL`: 验证字符串是否是合法的URL - `@AssertTrue`: 验证布尔值是否为true ## 高级验证注解说明 ### 1. 复合注解 - `@CreditCardNumber`: 验证信用卡号 - `@ISBN`: 验证ISBN号码 - `@SafeHtml`: 验证HTML内容安全性 ### 2. 数值和货币验证 - `@PositiveOrZero`: 验证数字大于等于0 - `@Positive`: 验证数字为正数 - `@NegativeOrZero`: 验证数字小于等于0 - `@Negative`: 验证数字为负数 ### 3. 时间验证扩展 - `@FutureOrPresent`: 验证日期是现在或将来 - `@PastOrPresent`: 验证日期是现在或过去 ### 4. 集合和Map验证 - 支持对List元素的验证:`List<@Email String>` - 支持对Map键值的验证:`Map<@NotBlank String, @NotNull String>` ### 5. 分组验证 - 基础验证组:`BasicValidation` - 高级验证组:`AdvancedValidation` - 验证顺序:`@GroupSequence` ### 6. 条件验证 - `@ScriptAssert`: 使用脚本进行复杂验证 - `@AssertTrue`: 自定义验证逻辑 ### 7. 嵌套验证 - `@Valid`: 触发嵌套对象的验证 - 支持复杂对象图的验证 ## 使用示例 1. 启动应用程序: ```bash mvn spring-boot:run ``` 2. 发送测试请求: ```bash curl -X POST http://localhost:8080/api/users \ -H "Content-Type: application/json" \ -d '{ "id": 1, "username": "testuser", "password": "Password123", "email": "test@example.com", "age": 25, "level": 3, "birthday": "2000-01-01", "planDate": "2024-12-31", "hobbies": ["reading", "gaming"], "homepage": "http://example.com", "agreementAccepted": true, "salary": 999.99, "rating": 4.5 }' ``` ## 高级验证示例 ### 订单验证示例 (OrderValidation.java) ```java // 分组验证示例 @NotNull(groups = BasicValidation.class) private Long orderId; // 条件验证示例 @AssertTrue(groups = AdvancedValidation.class) private boolean isValidPaymentCard() { if (paymentMethod == PaymentMethod.CREDIT_CARD) { return paymentCardNumber != null && !paymentCardNumber.trim().isEmpty(); } return true; } ``` ### 高级验证示例 (AdvancedValidationExample.java) ```java // 信用卡验证 @CreditCardNumber(message = "无效的信用卡号") private String creditCardNumber; // 货币金额验证 @PositiveOrZero(message = "金额必须大于或等于0") @Digits(integer = 10, fraction = 2, message = "金额格式无效") private BigDecimal amount; // 嵌套验证 @Valid private Address address; ``` ## 验证错误响应 当验证失败时,系统会返回详细的错误信息,例如: ```json [ "用户名长度必须在4-20之间", "邮箱格式不正确", "年龄不能大于150" ] ``` ## 注意事项 1. 验证注解可以组合使用 2. 建议为每个验证注解添加自定义错误消息 3. 可以使用分组验证来实现不同场景下的验证规则 4. 注意处理验证异常,提供友好的错误提示 ## 依赖说明 项目使用了以下主要依赖: - Spring Boot 2.7.0 - spring-boot-starter-validation - Lombok ## 测试用例 建议测试以下场景: 1. 所有字段都合法的情况 2. 必填字段为空的情况 3. 字段格式不正确的情况 4. 数值范围越界的情况 5. 日期格式错误的情况 ## 测试示例 ### 基础验证测试 ```bash curl -X POST http://localhost:8080/api/orders \ -H "Content-Type: application/json" \ -d '{ "orderId": 1, "customerName": "John Doe", "items": [ { "productId": 1, "productName": "Product A", "quantity": 2, "price": 99.99, "totalPrice": 199.98 } ], "totalAmount": 199.98, "paymentMethod": "CREDIT_CARD", "paymentCardNumber": "4111111111111111" }' ``` ### 高级验证测试 ```bash curl -X POST http://localhost:8080/api/validation/advanced \ -H "Content-Type: application/json" \ -d '{ "creditCardNumber": "4111111111111111", "amount": 99.99, "percentage": 75.5, "bookIsbn": "0-7475-3269-9", "phoneNumber": "+1 234 567 8900" }' ``` ## 最佳实践 1. 分组验证 - 使用验证组来分离不同场景的验证规则 - 使用`@GroupSequence`控制验证顺序 2. 自定义验证 - 使用`@AssertTrue`创建复杂的验证规则 - 结合业务逻辑实现条件验证 3. 错误处理 - 为每个验证注解提供清晰的错误消息 - 使用参数化消息支持国际化 4. 性能考虑 - 合理使用验证组避免不必要的验证 - 注意嵌套验证的深度