1. 实体
public class User {
@NotNull
private Integer id;
@NotNull
private String name;
@NotNull
@Length(min=6)
private String password;
@NotNull
@IsPhone //自定义的校验
private String phone;
}
2. Controller中使用
@PostMapping(value="login")
public String login(@Valid User user) {
}
3. 自定义校验
注解IsPhone
判断是否为手机号
package com.pibigstar.springboot.validator;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {PhoneValidator.class})
public @interface IsPhone {
boolean required() default true;
String message() default "手机号不合法"; //错误默认提示信息
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
4. 实现具体校验类
package com.pibigstar.springboot.validator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 手机号码验证者
* @author pibigstar
*
*/
public class PhoneValidator implements ConstraintValidator<IsPhone,String>{
private boolean requeired;
@Override
public void initialize(IsPhone constraintAnnotation) {
requeired = constraintAnnotation.required();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (requeired) {
return isPhone(value);
}else {
//phone 不是必须
if (value==null||value.length()==0) {
return true;
}else {
return isPhone(value);
}
}
}
private boolean isPhone(String phone) {
//以1开头,后面跟10个整数,一共11位
Pattern phonePattern = Pattern.compile("1\\d{10}");
if (phone==null||phone.length()<=0) {
return false;
}else {
Matcher matcher = phonePattern.matcher(phone);
return matcher.matches();
}
}
}
5. 对参数不通过进行统一捕获
参数验证不通过后统一格式返回给前端页面
package com.pibigstar.springboot.exception;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.pibigstar.springboot.domain.result.MyResponse;
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value=Exception.class)
public MyResponse exceptionHandler(HttpServletRequest request,Exception e) {
//参数校验异常
if (e instanceof BindException) {
BindException exception = (BindException) e;
List<ObjectError> allErrors = exception.getAllErrors();
ObjectError objectError = allErrors.get(0);
String defaultMessage = objectError.getDefaultMessage();
return MyResponse.error(defaultMessage);
}else {
//其他异常
return MyResponse.error(e);
}
}
}