在前端提交数据到后台(新增,修改)时,需要对前端传过来的参数进行校验。如果用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