一、需求背景
项目中使用实体类方式校验参数(javax.validation注解类)时,比如:
//实体类
package com.xx.openplat.dto;
import com.xx.common.annotation.NotBlankLength;
import com.xx.common.annotation.group.IGroupA;
import com.xx.common.constant.ValidRuleDef;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;
/**
* @ClassName PurCancelRequestDTO
* @Description xx接口
* @Author whb
* @Date 2023/2/6 13:42
* @Version 1.0
**/
@Data
public class PurCancelRequestDTO {
@NotBlank(message = "订单号不能为空")
@Pattern(regexp = ValidRuleDef.NUMBER_EN_LAST_3NUM_PATTERN, message = "订单号必须输入8-24位的数字或字母且最后3位必须为数字")
private String ordNo;// 订单号
@NotBlank(message = "申请时间不能为空")
@Pattern(regexp = ValidRuleDef.REGEXP_yyyyMMddHHmmss, message = "申请时间格式为yyyyMMddHHmmss")
private String applyTimeStr; // 申请时间
@NotBlank(message = "签约协议号不能为空")
@NotBlankLength(message = "签约协议号长度不能超过32位", max = 32)
private String agreeNo;// 签约协议号
......
}
//controller类使用
@PostMapping(value = "/purcancel")
public PurCancelResponseDTO purcancel(@RequestBody @Valid PurCancelRequestDTO dto) throws Exception {
.......
}
@NotBlank校验不为空,@Pattern校验是否匹配正则表达式是javax.validation类中的校验注解。
但在使用中却存在问题。校验时顺序不定,有时先校验@NotBlank,有时先校验@Pattern。需求是先校验不为空再校验其他。
二、解决方案
使用@GroupSequence对校验分组,定义先后校验顺序。javax.validation.GroupSequence
三、实战代码
1.新增校验组
public interface IGroupA {
}
public interface IGroupB {
}
public interface IGroupC {
}
2.@GroupSequence指定顺序
import javax.validation.GroupSequence;
import javax.validation.groups.Default;
/**
* validation校验分组
* 顺序为A,B,C,Default
*/
@GroupSequence({IGroupA.class, IGroupB.class, IGroupC.class, Default.class})
public interface IGroup {
}
3.参数校验
注解@NotBlank(message = "", groups = IGroupA.class),优先校验@NotBlank。
校验实体加上@Validated({IGroup.class})
//实体类
package com.xx.openplat.dto;
import com.xx.common.annotation.NotBlankLength;
import com.xx.common.annotation.group.IGroupA;
import com.xx.common.constant.ValidRuleDef;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.math.BigDecimal;
/**
* @ClassName PurCancelRequestDTO
* @Description xx接口
* @Author whb
* @Date 2023/2/6 13:42
* @Version 1.0
**/
@Data
public class PurCancelRequestDTO {
@NotBlank(message = "订单号不能为空", groups = IGroupA.class)
@Pattern(regexp = ValidRuleDef.NUMBER_EN_LAST_3NUM_PATTERN, message = "订单号必须输入8-24位的数字或字母且最后3位必须为数字")
private String ordNo;// 订单号
@NotBlank(message = "申请时间不能为空", groups = IGroupA.class)
@Pattern(regexp = ValidRuleDef.REGEXP_yyyyMMddHHmmss, message = "申请时间格式为yyyyMMddHHmmss")
private String applyTimeStr; // 申请时间
@NotBlank(message = "签约协议号不能为空")
@NotBlankLength(message = "签约协议号长度不能超过32位", max = 32)
private String agreeNo;// 签约协议号
.......
}
//controller类
@PostMapping(value = "/purcancel")
public PurCancelResponseDTO purcancel(@RequestBody @Validated({IGroup.class}) PurCancelRequestDTO dto) throws Exception {
.......
}