在做Spring项目的时候,@Valid可以完成优雅的参数校验,但是在不少特殊场景下,会有字段组合校验的场景.这种情况下,就需要在后台手动校验,那么如何在后端也优雅的参数校验,避免一堆判断和抛异常呢,可以试试在满足校验场景下手动触发@Valid校验.
1. 第一步:定义校验对象
点击查看代码
package com.sf.wms.finance.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* 自定义参数校验测试DTO
*/
@ApiModel(value = "SelfTestDTO", description = "自定义参数校验测试DTO")
@Data
public class SelfTestDTO {
@ApiModelProperty(value = "规则名")
@NotNull(message = "请输入规则名")
@Size(max = 25 , message = "规则名不能超过25个字符")
private String ruleName;
}
2. 第二步:自定义校验方法
点击查看代码
package com.sf.wms.finance.hanlder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;
@Component
public class SelfValid {
private static Validator validator;
/**
* 工具类自然需要静态注入
* @param validator
*/
@Autowired
public void setValidator(Validator validator) {
SelfValid.validator = validator;
}
public static void selfValid(Object t) {
Set<ConstraintViolation<Object>> set = validator.validate(t);
StringBuilder stringBuilder = new StringBuilder();
if (set.size() > 0) {
stringBuilder.append("校验不通过!");
} else {
return ;
}
for (ConstraintViolation<Object> constraintViolation : set) {
stringBuilder.append(constraintViolation.getMessage());
}
throw new RuntimeException(stringBuilder.toString());
}
}
3. 第三步,特殊场景下手动调用自定义校验方法
点击查看代码
// 当满足条件的时候 -> 调用
if(true){
mkSaveDTOList.forEach(mkSaveDTO -> SelfValid.selfValid(mkSaveDTO));
}