JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 ,JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解,指定校验规则,并通过标准的验证接口对 Bean 进行验证。
Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解。
包依赖:
以下版本没有与spring版本5发生包冲突
org.hibernate
hibernate-validator
5.4.1.Final
javax.validation
validation-api
1.1.0.Final
org.jboss.logging
jboss-logging
3.3.0.Final
com.fasterxml
classmate
1.3.1
org.hibernate.validator
hibernate-validator-annotation-processor
6.1.0.Final
spring配置文件:
classpath:CustomValidationMessages
springmvc配置文件:
在bean类配置验证信息:
@Setter@Getter
public class User implements Serializable {
private Integer uid;
@NotNull
private String uname;
@Email(message = "请输入正确的邮箱!")
private String uemail;
@NotNull
private String upassword;
@Max(value = 150,message = "请输入合法年龄")
@Min(value = 0,message = "请输入合法年龄")
private Integer uage;
}
检验规则参考:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
controller类:
/*
* 用户注册处理
* */
@RequestMapping(path="/signup")
public RestResult signup(@RequestBody @Valid User user, BindingResult bindingResult){
// 验证表单数据合法性
//不合法
if(bindingResult.hasErrors()){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
Map<String ,Object> errMap = new HashMap<>();
//输出错误信息
for(FieldError fe : fieldErrors){
System.out.println(fe.getField()+" : "+fe.getDefaultMessage());
errMap.put(fe.getField(),fe.getDefaultMessage());
}
// 以json的形式返回给浏览器
return resultGenerator.getFailResult("",errMap,errMap.size());
}
//调用service层方法 注册
try{
userService.addUser(user);
return resultGenerator.getSuccessResult();
}catch (Exception e){
return resultGenerator.getFailResult(e.getMessage());
}
}
/*
* 用户登录处理
* */
@RequestMapping(path = "/signin")
public RestResult signin(@RequestBody@Valid User user, BindingResult bindingResult){
System.out.println(user);
// 验证数据
if(bindingResult.hasErrors()){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
Map<String ,Object> errMap = new HashMap<>();
//输出错误信息
for(FieldError fe : fieldErrors){
System.out.println(fe.getField()+" : "+fe.getDefaultMessage());
errMap.put(fe.getField(),fe.getDefaultMessage());
}
return resultGenerator.getFailResult("",errMap,errMap.size());
}
// 数据库验证合法性
try{
userService.checkUser(user);
// 登录操作
//.....
return resultGenerator.getSuccessResult();
}catch (Exception e){
return resultGenerator.getFailResult(e.getMessage());
}
}
返回给浏览器的json:
{code: 400, msg: "", count: 1, data: {uage: "请输入合法年龄"}}