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();
    }
如果觉得我的文章对你有用,请随意赞赏