java使用validator进行校验

本文探讨了前后端数据交互时的参数校验方法,包括使用JDK和Hibernate提供的注解进行字段校验,以及自定义校验方式,通过AOP实现更灵活的错误反馈,确保数据的完整性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前端提交数据到后台(新增,修改)时,需要对前端传过来的参数进行校验。如果用if语句一个一个的判断,太臃肿了。幸好jdk或hibernate都提供了对object对象的校验,只需加上相应的注解即可。
一, 在需要校验的字段上加对应的注解。
在这里插入图片描述

1,校验方式一:当然只加注解是不够的,在使用这个对象时加注解@Valid
在这里插入图片描述
这个方式的校验,如果参数为空,服务器代码报500,不利于查看具体哪个参数为空。

2,校验方式二:自定义校验方式

1)自定义注解

package com.ikeep.commons.validator;

import java.lang.annotation.*;

/**
 * @author: zb
 * @since: 2019-02-03
 * @Description:
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ServiceParamValidator {
}

package com.ikeep.commons.validator;

import com.ikeep.api.Response;
import org.apache.commons.collections4.CollectionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.Ordered;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * service校验器切面
 * 
 * @author zb
 * @since 2019-2-3
 */
@Aspect
public class ServiceParamInterceptor implements Ordered {

    private int order = LOWEST_PRECEDENCE - 3000;

    public void setOrder(int order) {
        this.order = order;
    }

    @Override
    public int getOrder() {
        return order;
    }


    @Pointcut("@annotation(com.ikeep.commons.validator.ServiceParamValidator)")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        Object[] args = jp.getArgs();
        List<ConstraintViolation<?>> constraintViolationList = new ArrayList<>();
        for (Object parameter : args) {
            Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
            Set<? extends ConstraintViolation<?>> violationSet = validator.validate(parameter, Default.class);
            Iterator<? extends ConstraintViolation<?>> it = violationSet.iterator();
            while (it.hasNext()) {
                ConstraintViolation<?> constraintViolation = it.next();
                constraintViolationList.add(constraintViolation);
            }
        }


        if (CollectionUtils.isEmpty(constraintViolationList)) {
            return jp.proceed();
        }
        ConstraintViolation<?> constraintViolation = constraintViolationList.get(0);
        return Response.failure(new StringBuilder().append(constraintViolation.getPropertyPath())
                .append(constraintViolation.getMessage()).toString());
    }

}

返回异常提示,直接返回页面,前端可以查看报错信息。
在这里插入图片描述
在这里插入图片描述
2)使用时,在方法上加自定义的注解。
在这里插入图片描述

二,级联校验
如果校验的对象中包含另一个对象信息时,校验也要同时校验另一个对象,则可以使用@Valid
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值