Bean Validation 分组校验
分组校验是指同一个Bean
中,通过分组来实现组隔离校验,而不用重复建立Bean
,可以有效减少代码的编写量,也减少了阅读的障碍。
首先举个例子
@Data
@AllArgsConstructor
@NoArgsConstructor
@Schema(name = "统一下单 request dto")
@SuppressWarnings("all")
public class PayOrderUnifiedReqDTO {
/**
* 用户 IP
*/
@NotEmpty(message = "用户 IP 不能为空")
private String userIp;
// ========== 业务相关字段 ==========
/**
* 业务订单编号
*/
@NotEmpty(message = "业务订单编号不能为空")
private String merchantOrderId;
/**
* 商品标题
*/
@NotEmpty(message = "业务商品标题不能为空")
@Length(max = 32, message = "商品标题不能超过 32")
private String subject;
/**
* 商品描述信息
*/
@NotEmpty(message = "业务商品描述信息不能为空")
@Length(max = 128, message = "商品描述信息长度不能超过128")
private String body;
/**
* 业务商品类型
*/
@NotNull(message = "业务商品类型")
private Integer bizType;
/**
* 支付结果的 notify 回调地址
*/
@NotEmpty(message = "支付结果的回调地址不能为空")
@URL(message = "支付结果的 notify 回调地址必须是 URL 格式")
private String notifyUrl;
// /**
// * 支付结果的 return 回调地址
// */
// @URL(message = "支付结果的 return 回调地址必须是 URL 格式")
// private String returnUrl;
// ========== 订单相关字段 ==========
/**
* 支付金额,单位:分
*/
@NotNull(message = "支付金额不能为空")
@DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零")
private Integer amount;
/**
* 支付过期时间
*/
@NotNull(message = "支付过期时间不能为空")
private LocalDateTime expireTime;
// ========== 拓展参数 ==========
/**
* 支付渠道的额外参数
* 例如说,微信公众号需要传递 openid 参数
*/
private Map<String, String> channelExtras;
@NotNull(message = "设备类型不能为空", groups = {H5_WX.class, ANDROID_H5_WX.class, IOS_H5_WX.class})
private PayDeviceTypeEnum deviceType;
@NotNull(message = "iOS平台BundleID", groups = {H5_WX.class, IOS_H5_WX.class})
private String bundleId;
@NotNull(message = "Android平台PackageName", groups = {H5_WX.class, ANDROID_H5_WX.class})
private String packageName;
public interface WX_APP {
}
public interface H5_WX {
}
public interface IOS_H5_WX extends H5_WX {
}
public interface ANDROID_H5_WX extends H5_WX {
}
public interface PC_ALIPAY {
}
其中中的groups = {H5_WX.class, IOS_H5_WX.class}
代表bundleId
这个参数只有在属于H5_WX
或者IOS_H5_WX
分组时,才会校验参数,对于没有添加groups
的属性参数,无论分组如何都全局校验。
@NotNull(message = "iOS平台BundleID", groups = {H5_WX.class, IOS_H5_WX.class})
private String bundleId;
用法也很简单,在controller
中校验时,加上对应的校验组 @Validated({PayOrderUnifiedReqDTO.H5_WX.class})
即可。
@PostMapping("/valid")
public CommonResult<?> valid(@RequestBody @Validated({PayOrderUnifiedReqDTO.H5_WX.class}) PayOrderUnifiedReqDTO req) {
// 业务逻辑
return CommonResult.success();
}