当前位置: 首页 > news >正文

Java Bean数据校验实战指南,Spring——事务的传播性。

Java Bean 数据校验的实现方法

数据校验是软件开发中确保数据完整性和一致性的重要环节。Java Bean 数据校验通常通过注解和验证框架实现,以下是常见的实现方式。

使用 JSR 380 (Bean Validation 2.0) 标准

JSR 380 是 Java Bean 数据校验的官方标准,通过注解定义校验规则。引入依赖后,可以直接在 Bean 的属性上添加注解。

<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>

常见的校验注解包括@NotNull@Size@Pattern等。例如:

public class User { @NotNull(message = "用户名不能为空") private String username; @Size(min = 6, max = 20, message = "密码长度必须在6到20之间") private String password; }
集成 Hibernate Validator

Hibernate Validator 是 JSR 380 的参考实现,提供了更多扩展注解和功能。添加依赖后,可以直接使用 Hibernate 提供的额外注解。

<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.13.Final</version> </dependency>

示例代码:

public class Product { @NotBlank(message = "产品名称不能为空") private String name; @DecimalMin(value = "0.0", message = "价格必须大于等于0") private BigDecimal price; }
自定义校验注解

如果内置注解无法满足需求,可以自定义校验注解和校验逻辑。例如,定义一个校验手机号的注解:

@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = PhoneNumberValidator.class) public @interface PhoneNumber { String message() default "手机号格式不正确"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }

校验逻辑实现:

public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { return value != null && value.matches("^1[3-9]\\d{9}$"); } }
在 Spring 中自动校验

Spring 框架集成了 Bean Validation,可以通过@Valid@Validated注解触发自动校验。例如,在 Controller 中校验请求体:

@PostMapping("/users") public ResponseEntity<?> createUser(@Valid @RequestBody User user) { return ResponseEntity.ok("校验通过"); }

如果校验失败,Spring 会抛出MethodArgumentNotValidException,可以通过全局异常处理器返回友好的错误信息。

分组校验

某些场景下需要对同一个 Bean 在不同场景下应用不同的校验规则。通过定义分组接口,可以在注解中指定分组。

public interface CreateGroup {} public interface UpdateGroup {} public class Order { @NotNull(groups = {CreateGroup.class, UpdateGroup.class}) private Long id; @NotBlank(groups = CreateGroup.class) private String customerName; }

在 Controller 中指定分组:

@PostMapping("/orders") public ResponseEntity<?> createOrder(@Validated(CreateGroup.class) @RequestBody Order order) { return ResponseEntity.ok("创建订单校验通过"); }
校验集合类型

对于集合或数组类型的属性,可以使用@Valid注解递归校验每个元素。

public class Order { @Valid private List<OrderItem> items; }
编程式校验

除了自动校验,还可以通过Validator接口手动触发校验。

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set<ConstraintViolation<User>> violations = validator.validate(user);
国际化错误消息

通过定义ValidationMessages.properties文件,可以实现校验消息的国际化。

user.username.notnull=用户名不能为空 user.password.size=密码长度必须在{min}到{max}之间

在注解中引用消息:

public class User { @NotNull(message = "{user.username.notnull}") private String username; }

常见问题与优化建议

性能优化

频繁的校验可能影响性能,尤其是在高并发场景下。可以通过缓存Validator实例或减少不必要的校验规则来优化。

复杂业务校验

对于涉及多个字段关联或依赖外部服务的复杂校验,建议在 Service 层实现,而非完全依赖注解校验。

测试覆盖

为校验逻辑编写单元测试和集成测试,确保所有边界条件都被覆盖。使用工具如 JUnit 和 Mockito 模拟各种场景。

日志记录

在校验失败时记录详细的错误信息,便于排查问题。但需注意避免记录敏感数据。

通过以上方法,可以构建健壮的 Java Bean 数据校验机制,确保应用程序的数据质量和安全性。

http://www.cnnetsun.cn/news/1453151.html

相关文章:

  • C语言开发者也能用的AI模型:通过HTTP API调用BERT文本分割
  • kukuqaq | 一站式音乐聚合工具 搜索试听下载
  • Qt5.15.2 + MinGW32位环境配置libusb静态库(.a)全流程:从源码编译到项目集成
  • 三色排序:荷兰国旗最优解,sql题目基础50题。
  • Z-Image-Turbo-辉夜巫女Gradio性能压测:单卡支持最大并发数与平均响应时间
  • 黑客的隐秘武器:SQL注入与防御全攻略
  • 零代码自动化:OpenClaw+ollama-QwQ-32B快速搭建个人RSS阅读器
  • 终极指南:3分钟快速上手docx2tex,免费将Word文档转换为专业LaTeX
  • Appium 全解|博客视角:从架构、实战到企业级落地,移动端自动化测试的 “瑞士军刀”
  • 基于Python的社区老人健康信息管理系统毕业设计
  • 3张RTX 4090显卡也能玩转Qwen-Image?手把手教你低成本部署阿里最强开源文生图模型
  • LiuJuan20260223Zimage部署故障排查:解决403 Forbidden等常见网络错误
  • GitHub爆火的“印钞机“:我跑了3天代码,亏了200块,终于看清了真相
  • AI工具会不会让人变懒?我试了三个月后的答案 创意推敲这块
  • kvm aarch64 原理详解
  • 逍遥模拟器抓包实战:手把手教你用Burp Suite解密HTTPS的APK通信(2024版)
  • DanKoe 视频笔记:寻找意义:如何找到上帝
  • N76E003开发环境搭建避坑指南:从Keil C-51安装到Nu-Link驱动配置
  • Asian Beauty Z-Image Turbo 学术应用:辅助LaTeX论文插图与学术海报的快速生成
  • 【嵌入式】读代码之startup_stm32f103xb.s
  • MySQL 事务锁冲突排查
  • 手把手教你用STM32F405和RDA5807打造便携式数字收音机(附完整代码)
  • 家用Wi-Fi安全升级指南:WPA3还没普及?先搞定WPA2的这些关键设置
  • React Web完全指南:如何用React Native API构建跨平台Web应用
  • VLC播放器美化终极指南:5款VeLoCity主题让你的播放器焕然一新
  • supervisor 监控工具-superlance
  • Flutter GetX实战:5分钟搞定跨页面交互与状态管理
  • 别再只做静态页面了!用Three.js+GIS给你的旅游网站加点‘黑科技’
  • FPGA温度监测实战:手把手教你用SYSMONE4获取Ultrascale芯片温度(附计算公式)
  • 避坑指南:华为HCIA考试中最容易混淆的5个网络概念(含MAC地址查询技巧)