关于校验器Validator的使用

前言
很多校验的东西,只在前端作校验是非常不可靠的。但是如果后台只在入口处作相关校验可能也会引发问题。
比如,前端调用A接口,使用springboot注解做校验,@NotBlank或者@Length等,A接口继续调用B方法做业务处理。
这时候有一个问题,如果某种情况下会出现其他接口直接调用B方法,那么A接口中做的参数校验无法覆盖,所以需要在B方法中做参数校验。
怎么做呢?这时候不能当做入口直接校验了,所以直接引入校验器,模拟入口注解校验(甚至可以做到更严格)

1.引入校验器

    // 引入校验工具
    private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

    // 获取校验器
    private static Validator validator = factory.getValidator();

2.执行校验

public static Response checkUser(User user) {
        // 执行校验
        Set<ConstraintViolation<User>> violationSet;
        
		List<String> errorMessage = new ArrayList<>();
		
		//校验入参为空
        if (null == user) {
            errorMessage.add("user is empty!");
            return new Response(errorMessage,"Check not pass");
        }

        violationSet = validator.validate(user);

		//violat.getPropertyPath():需要校验的属性(比如User对象中的age属性)
		//violat.getMessage():校验不通过的原因(比如年龄最低为1岁,最高为120岁)
		//violat.getInvalidValue():你所填写的值(700岁)
		//该校验只校验hibernate.validator中的注解,每有一条校验不通过,violationSet就会add一条数据
		if (violationSet.size() != 0) {
            violationSet.forEach(violat -> {
                errorMessage.add(violat.getPropertyPath() + ":" + violat.getMessage() + "! But your message:"
                    + violat.getInvalidValue());
            });
            return new Response(errorMessage,"Check not pass");
        }
        
		//除了注解校验,还可以做其他校验,例如下
        if (null == user.getName()) {
        	errorMessage.add("user name is empty!");
            return new Response(errorMessage,"Check not pass");
        }

		//返回信息可以自己定义,增加相应错误码或者其他信息即可
		return new Response("pass");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值