java后台验证

xiaoxiao2021-02-28  36

java validation 后台参数验证

 一、前言

二、几种解决方案

三、使用bean validation 自带的注解验证

四、自定义bean validation 注解验证

 

 

一、前言

  在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节。比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的结果,下面说下几种解决方案。

二、几种解决方案

  1、struts2的valid可以通过配置xml,xml中描述规则和返回的信息,这种方式比较麻烦、开发效率低,不推荐

  2、validation bean 是基于JSR-303标准开发出来的,使用注解方式实现,及其方便,但是这只是一个接口,没有具体实现.Hibernate Validator是一个hibernate独立的包,可以直接引用,他实现了validation bean同时有做了扩展,比较强大 ,实现图如下:

    

    点此查看中文官方手册

   3、oval 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、JavaScript 、Groovy 、BeanShell 等进行规则的编写,本次不过多讲解

三、bean validation 框架验证介绍

  bean validation 包放在maven上维护,最新包的坐标如下:

1 2 3 4 5 < dependency >      < groupId >javax.validation</ groupId >      < artifactId >validation-api</ artifactId >      < version >1.1.0.Final</ version > </ dependency >

   点击这里查看最新的坐标地址

   下载之后打开这个包,有个package叫constraints,里面放的就是验证的的注解:

   

   下面开始用代码实践一下:

   1、定义一个待验证的bean:Student.java

View Code

     2、测试类:StudentTest.java

1 package com.use; 2 3 import javax.validation.ConstraintViolation; 4 import javax.validation.Validation; 5 import javax.validation.Validator; 6 import javax.validation.ValidatorFactory; 7 import java.io.Serializable; 8 import java.math.BigDecimal; 9 import java.util.ArrayList; 10 import java.util.Date; 11 import java.util.List; 12 import java.util.Set; 13 14 public class StudentTest implements Serializable { 15 public static void main(String[] args) { 16 Student xiaoming = getBean(); 17 List<String> validate = validate(xiaoming); 18 validate.forEach(row -> { 19 System.out.println(row.toString()); 20 }); 21 22 } 23 24 private static Student getBean() { 25 Student bean = new Student(); 26 bean.setName(null); 27 bean.setAddress("北京"); 28 bean.setBirthday(new Date()); 29 bean.setFriendName(null); 30 bean.setWeight(new BigDecimal(30)); 31 bean.setEmail("xiaogangfan163.com"); 32 return bean; 33 } 34 35 private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 36 37 public static <T> List<String> validate(T t) { 38 Validator validator = factory.getValidator(); 39 Set<ConstraintViolation<T>> constraintViolations = validator.validate(t); 40 41 List<String> messageList = new ArrayList<>(); 42 for (ConstraintViolation<T> constraintViolation : constraintViolations) { 43 messageList.add(constraintViolation.getMessage()); 44 } 45 return messageList; 46 } 47 }

     3、运行testValidation()方法,输处如下:

地址应该在6-30字符之间 邮箱的格式不合法 生日必须在当前时间之前 多吃点饭吧 名字不能为空 

     4、总结 

像@NotNull、@Size等比较简单也易于理解,不多说因为bean validation只提供了接口并未实现,使用时需要加上一个provider的包,例如hibernate-validator@Pattern 因为这个是正则,所以能做的事情比较多,比如中文还是数字、邮箱、长度等等都可以做@AssertTRue 这个与其他的校验注解有着本质的区别,这个注解适用于多个字段。例子中isHaveFriend方法依赖friendName字段校验验证的api是经过我加工了一下,这样可以批量返回校验的信息有时我们需要的注解可能没有提供,这时候就需要自定义注解,写实现类,下面说一下自定义注解的使用

 

四、自定义bean validation 注解验证

  有时框架自带的没法满足我们的需求,这时就需要自己动手丰衣足食了,恩恩 ,这个不难,下面说下。

  这个例子验证字符串是大写还是小写约束标注,代码如下:

  1、枚举类型CaseMode, 来表示大写或小写模式

View Code

  2、定义一个CheckCase的约束标注 

View Code

   3、约束条件CheckCase的验证器

1 package com.defineconstrain; 2 3 /** 4 * created by xiaogangfan 5 * on 16/10/25. 6 */ 7 import javax.validation.ConstraintValidator; 8 import javax.validation.ConstraintValidatorContext; 9 10 public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> { 11 12 private CaseMode caseMode; 13 14 public void initialize(CheckCase constraintAnnotation) { 15 this.caseMode = constraintAnnotation.value(); 16 } 17 18 public boolean isValid(String object, ConstraintValidatorContext constraintContext) { 19 20 if (object == null) 21 return true; 22 23 if (caseMode == CaseMode.UPPER) 24 return object.equals(object.toUpperCase()); 25 else 26 return object.equals(object.toLowerCase()); 27 } 28 29 }

  4、在Student.java中增加一个属性

1 @CheckCase(value = CaseMode.LOWER,message = "名字的拼音需要小写") 2 private String spellName;

  5、在StudentTest.java的getBean()方法中增加一行

bean.setSpellName("XIAOGANGFAN");

  6、运行testValidation()方法,输处如下:

地址应该在6-30字符之间 邮箱的格式不合法 生日必须在当前时间之前 多吃点饭吧 名字的拼音需要小写 名字不能为空
转载请注明原文地址: https://www.6miu.com/read-2631823.html

最新回复(0)