快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
开发一个电商订单提交接口,使用@validated验证订单数据:1)收货地址(非空) 2)商品列表(非空,每个商品需有ID和数量) 3)支付方式(枚举值验证) 4)优惠券(可选,但需验证格式)。要求分组验证:创建订单时验证前3项,支付时验证全部。生成包含自定义错误消息的完整代码。 - 点击'项目生成'按钮,等待项目生成完整后预览效果

在电商系统的开发中,订单模块的数据校验是保证业务可靠性的关键环节。最近我在开发一个订单提交接口时,深入实践了Spring的@Validated注解,总结出一套适合复杂业务场景的验证方案,下面分享具体实现思路和踩坑经验。
1. 业务需求分析
电商订单提交通常涉及多层级数据校验,本次需求明确分为两个场景:
- 基础创建验证:用户点击提交订单时,需验证收货地址、商品列表和支付方式
- 完整支付验证:用户跳转支付前,额外增加优惠券格式校验
这种分阶段验证的需求,正是@Validated注解的分组验证特性大显身手的地方。
2. 验证规则设计
针对每个字段制定了具体约束:
- 收货地址
- 必须为非空字符串
-
实际业务中可扩展正则验证具体格式
-
商品列表
- 数组不能为空
-
每个商品对象必须包含有效的商品ID和大于0的数量
-
支付方式
- 限定为枚举值(如支付宝、微信、银行卡)
-
防止前端传递非法支付渠道
-
优惠券(可选)
- 当存在时需符合"类型-编号"的格式(如DISCOUNT-2024)
- 使用正则表达式验证
3. 分组验证实现
通过定义验证分组接口区分不同场景:
public interface CreateCheck {} // 创建订单校验组
public interface PayCheck extends CreateCheck {} // 支付校验组(继承确保包含基础校验)
在DTO对象上标注分组信息:
@NotBlank(groups = CreateCheck.class)
private String address;
@NotEmpty(groups = CreateCheck.class)
private List<@Valid OrderItem> items;
@NotNull(groups = CreateCheck.class)
private PaymentMethod payment;
@Pattern(regexp = "^[A-Z]+-\\d+$", groups = PayCheck.class)
private String couponCode;
4. 控制器层配置
在Controller方法使用@Validated指定生效的校验组:
@PostMapping("/create")
public Result createOrder(@RequestBody @Validated(CreateCheck.class) OrderDTO dto) {
// 创建订单逻辑
}
@PostMapping("/pay")
public Result payOrder(@RequestBody @Validated(PayCheck.class) OrderDTO dto) {
// 支付逻辑
}
5. 异常处理优化
默认的校验错误信息不够友好,通过统一异常处理增强用户体验:
- 捕获MethodArgumentNotValidException异常
- 提取字段错误信息
- 组合成前端需要的响应格式
- 对常见错误类型提供多语言支持
6. 实战经验总结
在项目落地过程中,有几个值得注意的要点:
- 嵌套验证:对于商品列表中的每个OrderItem对象,需要加@Valid触发级联验证
- 分组继承:PayCheck继承CreateCheck可避免重复定义基础规则
- 性能考量:复杂正则表达式要评估性能影响
- 测试覆盖:
- 边界值测试(如空列表、极长地址)
- 组合场景测试(使用优惠券+无效支付方式)
7. 扩展思考
这套验证方案还可以进一步优化:
- 结合自定义注解实现更复杂的业务规则(如库存校验)
- 将通用验证逻辑提取为starter供其他服务复用
- 整合Hibernate Validator的国际化消息机制
通过这次实践,我深刻体会到合理使用@Validated可以:
- 减少大量重复的if-else校验代码
- 通过分组机制灵活适应多阶段业务流程
- 保持验证逻辑与业务逻辑解耦
在InsCode(快马)平台上实践这类项目特别方便,其内置的Java环境和一键部署功能,让我能快速验证各种校验场景。实际体验中,从编写代码到测试部署的整个流程非常流畅,特别是实时预览功能可以立即看到验证效果,大大提升了开发效率。
快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
开发一个电商订单提交接口,使用@validated验证订单数据:1)收货地址(非空) 2)商品列表(非空,每个商品需有ID和数量) 3)支付方式(枚举值验证) 4)优惠券(可选,但需验证格式)。要求分组验证:创建订单时验证前3项,支付时验证全部。生成包含自定义错误消息的完整代码。 - 点击'项目生成'按钮,等待项目生成完整后预览效果
1029

被折叠的 条评论
为什么被折叠?



