使用校验框架validation和JSR303进行字段验证
JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 6.0 中 ,JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解,指定校验规则,并通过标准的验证接口对 Bean 进行验证。
Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解。
包依赖:
以下版本没有与spring版本5发生包冲突
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.0.Final</version>
</dependency>
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>6.1.0.Final</version>
</dependency>
spring配置文件:
<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器-->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校验使用的资源文件,在文件中配置校验的错误信息,如果不指定则默认使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名,使用basenames,不用加后缀名-->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="fileEncodings" value="utf-8" />
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
springmvc配置文件:
<!--自动注入bean-->
<mvc:annotation-driven />
在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: "请输入合法年龄"}}