项目开发框架:springboot 2.0.5.RELEASE
在POM.xml引入校验的依赖包
<!--引入spring-boot-starter-validation
用于字段校验的框架
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
/**
* @ClassName BeanValidator
* @Description: 对象校验器
* http://ifeve.com/use-bean-validation/
* @Date 2020/7/9
* @Version V1.0
**/
import javax.validation.Validation;
import javax.validation.ConstraintViolation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import java.util.Set;
import static com.google.common.collect.Iterables.getFirst;
public class BeanValidator {
/**
* 验证某个bean的参数
* @param object 被校验的参数
* @param groups 校验参数分组
* @throws ValidationException 如果参数校验不成功则抛出此异常
*/
public static <T> void validate(T object,Class<?>... groups) {
//获得验证器
Validator validator =Validation.buildDefaultValidatorFactory().getValidator();
Validation.buildDefaultValidatorFactory().getValidator();
//执行验证
Set<ConstraintViolation<T>> constraintViolations = validator.validate(object,groups);
//如果有验证信息,则将第一个取出来包装成异常返回
ConstraintViolation<T> constraintViolation = getFirst(constraintViolations, null);
if (constraintViolation != null) {
throw new BusinessException(0,constraintViolation.getMessage());
}
}
}
//自定义异常处理类
public class BusinessException extends RuntimeException {
private Integer status;
private String msg;
public BusinessException(ResultEnum resultEnum) {
this.status = resultEnum.getStatus();
this.msg = resultEnum.getMsg();
}
public BusinessException(Integer status, String msg) {
this.status = status;
this.msg = msg;
}
}
//系统异常捕获类
@RestControllerAdvice
@Slf4j
public class BusinessExceptionHandler {
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public ResultVO handlerBusinessException(BusinessException be) {
return ResultVOUtil.error(be.getStatus(), be.getMsg());
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResultVO handlerBusinessException(Exception e) {
e.printStackTrace();
String msg = "系统异常";
String emsg = e.getMessage();
log.error(msg + "=============" + emsg);
return ResultVOUtil.error(0, msg);
}
}
/*
*Controller中如何校验
*/
@RequestMapping("/saveOneData")
@ApiOperation("新增合同")
public ResultVO<Object> saveOneData(@RequestParam("files") MultipartFile[] files,PurContractRequest req) {
logger.info("新增合同,param{}", JSONObject.toJSONString(req));
//新增参数校验
//通过Creation 类来区分是新增参数还是修改参数校验
BeanValidator.validate(req, Creation.class);
//调用service新增合同
return ResultVOUtil.success();
}
/*
*定义一个新增分组接口
*/
public interface Creation extends Default {
}
/**
*定义一个接收前端参数的实体类
*@Data lombok插件提供get和set方法
*@Valid 添加在需要校验的对象上
*groups = {Creation.class} 指定该参数在什么时候被校验(新增还是修改),其实就是给参数分组,达到分组校验的目标
*/
@Data
public class PurContractRequest{
/**
* 保存方式
* 0:保存 1:保存并申请
*/
@NotNull(message = "保存方式不能为空",groups = {Creation.class})
private Integer saveType;
/**
* 合同基本信息
*/
@NotNull(message="合同基本信息不能为空")
@Valid
private PurchaseContract ypPurchaseContract;
/**
* 双方主体信息
*/
@NotNull(message="双方主体信息不能为空")
@Valid
private PurPartyInfo ypPurPartyInfo;
}
使用postman提交参数,校验结果如下: