步骤一:实现切面类
package com.jinp.jx.vediobigdata.common.bean;
import com.jinp.jx.vediobigdata.common.exception.BusinessException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import javax.annotation.Resource;
import javax.validation.ConstraintViolation;
import javax.validation.groups.Default;
import java.util.Iterator;
import java.util.Set;
/**
* @Description: <br>
* @Project: vediobigdata <br>
* @CreateDate: Created in 2019/4/29 14:13 <br>
* @Author: xiaozm
*/
@Order(2)
@Component
@Aspect
public class ValidatorAspect {
@Resource
private LocalValidatorFactoryBean localValidatorFactoryBean;
public ValidatorAspect() {
}
/**
* 方式1:切入点(
*/
@Pointcut(
"@annotation(org.springframework.web.bind.annotation.RequestMapping)" +
"||@annotation(org.springframework.web.bind.annotation.GetMapping)" +
"||@annotation(org.springframework.web.bind.annotation.PostMapping)" +
"||@annotation(org.springframework.web.bind.annotation.PutMapping)"
)
// @Pointcut("execution(* com.*..controller.*.*(..))")//方式2
private void parameterPointCut() {
}
/**
* 处理
*
* @param joinPoint
* @param request 参数必须是第一个对象
*/
@Before("parameterPointCut() && args(request,..)")
public void validateParameter(JoinPoint joinPoint, DataEntity request) throws BusinessException{
Set<ConstraintViolation<DataEntity>> validErrors = this.localValidatorFactoryBean.validate(request, new Class[]{Default.class});
Iterator iterator = validErrors.iterator();
StringBuilder errorMsg = new StringBuilder();
while (iterator.hasNext()) {
ConstraintViolation constraintViolation = (ConstraintViolation) iterator.next();
String error = constraintViolation.getPropertyPath() + ":" + constraintViolation.getMessage();
errorMsg.append(iterator.hasNext() ? error + "; " : error);
}
if (!validErrors.isEmpty()) {
throw new BusinessException(BusinessException.CHECKED_EXCEPTION_CODE, errorMsg.toString());
}
}
}
步骤二:在entity实体类中加入对应的校验注解
@NotNull(message = "ID不能为空")
@Range(min = 1, max = 100, message = "ID必须在1到100之间")
private Integer id;
@NotBlank(message = "姓名不能为空")
@Length(min = 2, max = 6, message = "姓名必须在2到6位之间")
private String name;
@NotNull(message = "余额不能为空")
@DecimalMax(value = "30.50", message = "余额不能超过30.5")
@DecimalMin(value = "1.50", message = "余额不能低于1.5")
private BigDecimal amount;
@NotNull(message = "生日不能为空")
@Past(message = "生日必须是过去")
private Date birthday;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
@NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^(((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(16[6])|(17[0135678])|(18[0-9])|(19[89]))\\d{8})$", message = "手机号格式错误")
private String phone;