常用的Validator
@NotBlank 非空校验,表示不能为空,包括null或“”的校验,至少包含一个非空字符,适用于CharSequence
@NotNull 非空校验,表示不能为null,适用于任何类型
@NotEmpty 非空校验,表示不能为空字符串或CharSequence、Collection、Map、Array不能为空集合
@Min/@Max 最大值、最小值校验
@Size 长度校验,适用于CharSequence、Collection、Map、Array
@Email 邮件格式校验
@Pattern 正则校验
基本用法
在实体定义中,属性或构建函数增加相应的注解,如下:
package ;
import ;
import .*;
import ;
/**
* 用户模型
*
* @author
* @create 2017-10-19 09:16
* @contact 563750241
* @email 563750241@
*/
public class User implements Serializable {
private static final long serialVersionUID = -1925045206419899653L;
@NotNull(message = "Id不能为空")
@Max(value = 1000)
private Long id;
@NotEmpty
@Size(min = 1, max = 10, message = "")
private String name;
/**
* 以ZX开头 用-隔开 以数字结尾
*/
@TransNoValidator
private String transNo;
@NotBlank
@Email
private String email;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTransNo() {
return transNo;
}
public void setTransNo(String transNo) {
this.transNo = transNo;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
在Controller中,捕捉不符合条件的校验结果
package ;
import ;
import org.;
import org.;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* 用于学习Bean Validator,包括使用系统自带的Bean Validator 与 自定义Validator
*
* @author
* @create 2017-10-23 09:33
* @contact 563750241
* @email 563750241@
*/
@RestController
public class ValidatorController {
private static final Logger logger = ();
@PostMapping(value = "/validator/user/save")
public User save(@Valid @RequestBody User user, BindingResult result) {
().forEach(objectError -> {
("==========");
FieldError fieldError = (FieldError) objectError;
("Field: %s Message: %s \n",
(),
());
});
return user;
}
}
以上方式,必须针对每个Controller进行分别处理,亦可使用全局异常处理的方式进行统一的拦截,然后转换成适合项目的数据格式,比如JSON
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* 异常切面
*
* @author
* @create 2017-10-23 11:18
* @contact 563750241
* @email 563750241@
*/
@RestControllerAdvice
public class ApiExceptionHandler {
@ExceptionHandler()
public Map<String, Object> handleException(Throwable ex) {
MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;
BindingResult result = ();
List<FieldError> fieldErrors = ();
Map<String, Object> errorMap = new HashMap<>(16);
(objectError -> {
FieldError fieldError = (FieldError) objectError;
("Field: %s Message: %s \n",
(),
());
((), ());
}
);
return errorMap;
}
}
自定义Validator
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import static .*;
import static ;
/**
* TransNoValidator
*
* @author
* @create 2017-10-23 09:53
* @contact 563750241
* @email 563750241@
*/
@Target({ FIELD })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface TransNoValidator {
String message() default "{}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
Validator消息格式化
-
com.garlic.validation.constraints.TransNoValidator.message=\ Trans No must start with ZX, and the suffix is numeric.
-
ValidateMessages_zh
com.garlic.validation.constraints.TransNoValidator.message=\ 交易流水号必须以ZX开头,以数字结尾