详解使用弹簧验证完成数据后端校验

  

  

数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已。我在之前保险产品研发过程中,系统对数据校验要求比较严格且追求可变性及效率,曾使用drools作为规则引擎,兼任了校验的功能。而在一般的应用,可以使用本文将要介绍的验证来对数据进行校验。

  

简述JSR303/jsr - 349, hibernate验证,春天验证之间的关系.JSR303是一项标准,jsr - 349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null, @NotNull, @Pattern,他们位于javax.validation。包的约束下,只提供规范不提供实现。而hibernate验证是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如,@Length, @Range等等,他们位于org.hibernate.validator。约束包下。而万能的春天为了给开发者提供便捷,对hibernate验证进行了二次封装,显示校验验证bean时,你可以使用弹簧验证或者hibernate验证,而春天验证另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中,这无疑便捷了我们的网络开发。本文主要介绍在springmvc中自动校验的机制。

  

  

我们使用maven构建springboot应用来进行演示演示。

        & lt; dependencies>   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-web   & lt;/dependency>   & lt;/dependencies>      

我们只需要引入spring-boot-starter-web依赖即可,如果查看其子依赖,可以发现如下的依赖:

        & lt; dependency>   & lt; groupId> org.hibernate   & lt; artifactId> hibernate-validator   & lt;/dependency>   & lt; dependency>   & lt; groupId> com.fasterxml.jackson.core   & lt; artifactId> jackson-databind   & lt;/dependency>      

验证了我之前的描述,网模块使用了hibernate验证,并且databind模块也提供了相应的数据绑定功能。

  

  

无需添加其他注解,一个典型的启动类

        @SpringBootApplication   公开课ValidateApp {      公共静态void main (String [] args) {   SpringApplication.run (ValidateApp.class, args);   }   }      

创建需要被校验的实体类

        公共类Foo {      @NotBlank   私人字符串名称;      @Min (18)   私人整数年龄;      @Pattern (regexp=" ^ 1 (3 | 4 | 5 | 7 | 8) \ \ d{9} $”,消息=笆只怕敫袷酱砦蟆?   @NotBlank(消息="手机号码不能为空”)   私人字符串电话;      (消息="邮箱格式错误”)   私人字符串邮件;//璯etter setter      }      

使用一些比较常用的校验注解,还是比较浅显易懂的,字段上的注解名称即可推断出校验内容,每一个注解都包含了消息字段,用于校验失败时作为提示信息,特殊的校验注解,如模式(正则校验),还可以自己添加正则表达式。

  

  

springmvc为我们提供了自动封装表单参数的功能,一个添加了参数校验的典型控制器如下所示。

        @ controller   公开课FooController {      @RequestMapping ("/foo”)   公共字符串foo (@Validated foo foo & lt; 1祝辞,BindingResult BindingResult & lt; 2祝辞){   如果(bindingResult.hasErrors ()) {   (FieldError FieldError: bindingResult.getFieldErrors ()) {//?   }   返回“失败”;   }   返回“成功”;   }      }      

值得注意的地方:

  

& lt; 1比;参数Foo前需要加上@Validated注解,表明需要春天对其进行校验,而校验的信息会存放到其后的BindingResult中。注意,必须相邻,如果有多个参数需要校验,形式可以如下. Foo (@Validated Foo Foo, BindingResult fooBindingResult, @Validated酒吧酒吧,BindingResult barBindingResult),即一个校验类对应一个校验结果。

  

& lt; 2比;校验结果会被自动填充,在控制器中可以根据业务逻辑来决定具体的操作,如跳转到错误页面。

详解使用弹簧验证完成数据后端校验