如何在Json转Object时校验对象的属性是否符合规则

项目开发框架: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提交参数,校验结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值