数据的校验是交互式网站一个不可或缺的功用,前端的js校验能够涵盖大部分的校验职责,如用户名唯一性,生日花样,邮箱花样校验等等经常运用的校验。然则为了防备用户绕过浏览器,运用http东西直接向后端要求一些违法数据,服务端的数据校验也是必要的,能够防备脏数据落到数据库中,假如数据库中涌现一个不法的邮箱花样,也会让运维职员头疼不已。
JSR303/JSR-349,hibernate validation,spring validation之间的关联。JSR303是一项范例,JSR-349是其的升级版本,增加了一些新特征,他们划定一些校验范例即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只供应范例不供应完成。而hibernate validation是对这个范例的实践(不要将hibernate和数据库orm框架联络在一起),他供应了响应的完成,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。而全能的spring为了给开辟者供应便利,对hibernate validation举行了二次封装,显现校验validated bean时,你能够运用spring validation或许hibernate validation,而spring validation另一个特征,就是其在springmvc模块中增加了自动校验,并将校验信息封装进了特定的类中。这无疑便利了我们的web开辟。本文重要引见在springmvc中自动校验的机制。
引入依靠
我们运用maven构建springboot应用来举行demo演示。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
我们只须要引入spring-boot-starter-web依靠即可,假如检察其子依靠,能够发明以下的依靠:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
考证了我之前的形貌,web模块运用了hibernate-validation,而且databind模块也供应了响应的数据绑定功用。
构建启动类
无需增加其他注解,一个典范的启动类
@SpringBootApplication public class ValidateApp { public static void main(String[] args) { SpringApplication.run(ValidateApp.class, args); } }
建立须要被校验的实体类
public class Foo { @NotBlank private String name; @Min(18) private Integer age; @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码花样毛病") @NotBlank(message = "手机号码不能为空") private String phone; @Email(message = "邮箱花样毛病") private String email; //... getter setter }
运用一些比较经常运用的校验注解,照样比较浅显易懂的,字段上的注解称号即可推断出校验内容,每个注解都包含了message字段,用于校验失利时作为提醒信息,特别的校验注解,如Pattern(正则校验),还能够本身增加正则表达式。
在@Controller中校验数据
@Controller public class FooController { @RequestMapping("/foo") public String foo(@Validated Foo foo <1>, BindingResult bindingResult <2>) { if(bindingResult.hasErrors()){ for (FieldError fieldError : bindingResult.getFieldErrors()) { //... } return "fail"; } return "success"; } }
值得注重的处所:
<1> 参数Foo前须要加上@Validated注解,表明须要spring对其举行校验,而校验的信息会存放到厥后的BindingResult中。注重,必需相邻,假如有多个参数须要校验,情势能够以下。foo(@Validated Foo foo, BindingResult fooBindingResult ,@Validated Bar bar, BindingResult barBindingResult);即一个校验类对应一个校验效果。
<2> 校验效果会被自动添补,在controller中能够依据营业逻辑来决议细致的操纵,如跳转到毛病页面。
一个最基本的校验就完成了,总结下框架已供应了哪些校验:
JSR供应的校验注解: @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=) 被解释的元素必需相符指定的正则表达式 Hibernate Validator供应的校验注解: @NotBlank(message =) 考证字符串非null,且长度必需大于0 @Email 被解释的元素必需是电子邮箱地址 @Length(min=,max=) 被解释的字符串的大小必需在指定的范围内 @NotEmpty 被解释的字符串的必需非空 @Range(min=,max=,message=) 被解释的元素必需在适宜的范围内
分组校验
假如同一个类,在差别的运用场景下有差别的校验划定规矩,那末能够运用分组校验。未成年人是不能饮酒的,而在其他场景下我们不做特别的限制,这个需求怎样表现同一个实体,差别的校验划定规矩呢?
改写注解,增加分组:
Class Foo{ @Min(value = 18,groups = {Adult.class}) private Integer age; public interface Adult{} public interface Minor{} }
如许表明,只要在Adult分组下,18岁的限制才会起作用。
Controller层改写:
@RequestMapping("/drink") public String drink(@Validated({Foo.Adult.class}) Foo foo, BindingResult bindingResult) { if(bindingResult.hasErrors()){ for (FieldError fieldError : bindingResult.getFieldErrors()) { //... } return "fail"; } return "success"; } @RequestMapping("/live") public String live(@Validated Foo foo, BindingResult bindingResult) { if(bindingResult.hasErrors()){ for (FieldError fieldError : bindingResult.getFieldErrors()) { //... } return "fail"; } return "success"; }
drink要领限制须要举行Adult校验,而live要领则不做限制。
基于要领校验
@RestController @Validated <1> public class BarController { @RequestMapping("/bar") public @NotBlank <2> String bar(@Min(18) Integer age <3>) { System.out.println("age : " + age); return ""; } @ExceptionHandler(ConstraintViolationException.class) public Map handleConstraintViolationException(ConstraintViolationException cve){ Set<ConstraintViolation<?>> cves = cve.getConstraintViolations();<4> for (ConstraintViolation<?> constraintViolation : cves) { System.out.println(constraintViolation.getMessage()); } Map map = new HashMap(); map.put("errorCode",500); return map; } }
<1> 为类增加@Validated注解
<2> <3> 校验要领的返回值和入参
<4> 增加一个非常处理器,能够获得没有经由过程校验的属性相干信息
以上就是spring validation作为数据校验的要领引见(附代码)的细致内容,更多请关注ki4网别的相干文章!