springboot validation,

  springboot validation,

  00-1010 1、前言2、常见验证3、spring boot的数据自动验证功能3.1引入依赖项3.2构建启动类3.3创建待验证的实体类3.4验证控制器中的数据3.5统一异常处理4。用户定义的验证注释4.1 @NameValidation4.2验证类NameValidationValidator4.3向Person类5添加新注释。摘要

  00-1010数据的验证是互动网站不可或缺的功能。前端的js验证可以覆盖大部分的验证职责,比如用户名唯一性、生日格式、邮件格式等的验证。但是为了防止用户绕过浏览器,使用http工具直接向后端请求一些非法数据,服务器端的数据验证也是必要的,可以防止脏数据落入数据库。如果数据库中出现非法邮箱格式,也会让运维人员头疼。您可以使用本文将介绍的验证来验证数据。

  00-1010 1.JSR303/JSR-3493360JSR303是一个标准,它只提供规范,不提供实现。它规定了一些验证规范,也就是验证注释,比如@Null、@NotNull、@Pattern,位于javax.validation.constraints包中。JSR-349是它的升级版,增加了一些新功能。

  @Null批注元素必须为null@NotNull批注元素不能为null@AssertTrue批注元素必须为true@AssertFalse批注元素必须为false@Min(value)批注元素必须为数字, 其值必须大于或等于指定的最小值@Max(value)带注释的元素必须是数字,其值必须小于或等于指定的最大值@DecimalMin(value)带注释的元素必须是数字,其值必须大于或等于指定的最小值@DecimalMax(value)带注释的元素必须是数字,其值必须小于或等于指定的最大值@Size(max, min)带注释元素的大小必须在指定的范围内@Digits(整数,小数)带注释元素必须是数字,其值必须在可接受的范围内@Past带注释元素必须是过去的日期@Future带注释元素必须是未来的日期@Pattern(值)带注释元素必须符合指定的正则表达式2。 Hibernate验证:Hibernate验证是这个规范的实现,还增加了一些其他的验证注释,比如@Email、@Length、@Range等。

  @Email带注释的元素必须是电子邮件地址@Length带注释的字符串的大小必须在指定的范围内@NotEmpty带注释的字符串必须是非空的@Range带注释的元素必须在适当的范围内。3.Spring验证:Spring验证对hibernate验证进行了两次封装,在springmvc模块中增加了自动验证,并将验证信息封装到一个特定的类中。

  

目录

 

  00-1010 Spring-Web模块使用hibernate-validation,databind模块也提供了相应的数据绑定功能。

  依赖项依赖项groupIdorg.springframework.boot/groupId工件spring-boot-starter-web/工件ID/依赖项/依赖项我们只需要介绍Spring-Boot-Starter-Web依赖项。如果我们查看它的依赖关系,我们可以发现以下依赖关系:

  依赖性groupIdorg.hibernate/groupId artifactId hibernate-validator/artifactId/dependency dependency groupId com . faster XML . Jackson . core/groupId artifactId Jackson-databind/artifactId/dependency

  

1、前言

@ SpringBootApplicationpublic类App { public

 

  static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("Start app success."); }}

 

  

3.3 创建需要被校验的实体类

public class Person { @NotEmpty(message = "name不能为空") private String name; @Range(min = 0, max = 100, message = "age不能大于100小于0") private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}

 

  

3.4 在Controller中校验数据

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

 

  

@RequestMapping("/test")public String valid(@Validated Person person, BindingResult bindingResult) { if (bindingResult.hasErrors()) { for (FieldError fieldError : bindingResult.getFieldErrors()) { System.out.println(fieldError); } return "fail"; } return "success";}

值得注意的地方:

 

  参数Persison前需要加上@Validated注解,表明需要spring对其进行校验,而校验的信息会存放到其后的BindingResult中。注意,必须相邻,如果有多个参数需要校验,形式可以如下。valid(@Validated Person person, BindingResult personBindingResult ,@Validated Person2 person2, BindingResult person2BindingResult);即一个校验类对应一个校验结果。校验结果会被自动填充,在controller中可以根据业务逻辑来决定具体的操作,如跳转到错误页面。一个最基本的校验就完成了.

  启动容器测试结果如下:

  

Field error in object 'person' on field 'age': rejected value [105]; codes [Range.person.age,Range.age,Range.int,Range]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.age,age]; arguments []; default message [age],100,0]; default message [age不能大于100小于0]

 

  

 

  

3.5 统一异常处理

前面那种方式处理校验错误,略显复杂,而且一般网站都会对请求错误做统一的404页面封装,如果数据校验不通过,则Spring boot会抛出BindException异常,我们可以捕获这个异常并使用Result封装返回结果。通过@RestControllerAdvice定义异常捕获类。

 

  Controller类:

  

@RequestMapping(value = "valid", method = RequestMethod.GET)public String valid(@Validated Person person) { System.out.println(person); return "success";}

统一异常处理类:

 

  

@RestControllerAdvicepublic class BindExceptionHanlder { @ExceptionHandler(BindException.class) public String handleBindException(HttpServletRequest request, BindException exception) { List<FieldError> allErrors = exception.getFieldErrors(); StringBuilder sb = new StringBuilder(); for (FieldError errorMessage : allErrors) { sb.append(errorMessage.getField()).append(": ").append(errorMessage.getDefaultMessage()).append(", "); } System.out.println(sb.toString()); return sb.toString(); }}

测试: http://localhost:8080/valid?age=105&name=steven

 

  

 

  输出:age: age不能大于100小于0,

  

 

  

 

  

4、自定义校验注解

 

  

4.1 @NameValidation

@Documented@Constraint(validatedBy = NameValidationValidator.class)@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RUNTIME)public @interface NameValidation { String message() default "不是合法的名字"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; @Target({PARAMETER, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { NameValidation[] value(); }}

 

  

4.2 校验类NameValidationValidator

public class NameValidationValidator implements ConstraintValidator<NameValidation, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { if ("steven".equalsIgnoreCase(value)) { return true; } String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate(); System.out.println("default message :" + defaultConstraintMessageTemplate); //禁用默认提示信息//context.disableDefaultConstraintViolation(); //设置提示语//context.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation(); return false; }}

 

  

4.3 在Person类增加新注解

@NotEmpty(message = "name不能为空")@NameValidationprivate String name;

测试: http://localhost:8080/valid?age=105&name=lxy

 

  输出:age: age不能大于100小于0, name: 不是合法的名字,

  

 

  

 

  

5、总结

通过上面的例子可以看出,其实使用很简单,但是有没有注意到一个问题,错误信息没有实现国际化。hibernate-validator国际化还是比较繁琐的,包含:

 

  SpringBoot场景国际化SpringMvc场景国际化Spring Jersey场景国际化非Spring场景国际化以上就是SpringBoot利用validation实现优雅的校验参数的详细内容,更多关于SpringBoot validation校验参数的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: