JAVA validation 后台参数验证

一、前言

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

二、解决方案

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

  2、validation bean 是基于JSR-303标准开发出来的,使用注解方式实现,及其方便,下面会重点介绍

  3、Hibernate Validator.这是一个hibernate独立的包,可以直接引用,实际上是在validation bean基础上进行了扩展,如下图

    

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

三、bean validation 框架验证介绍

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

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

   最新的地址:http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22javax.validation%22%20AND%20a%3A%22validation-api%22 

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

   

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

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

 1 package com.use;
 2
 3 import javax.validation.constraints.*;
 4 import java.io.Serializable;
 5 import java.math.BigDecimal;
 6 import java.util.Date;
 7
 8 public class Student implements Serializable {
 9
10
11     @NotNull(message = "名字不能为空")
12     private String name;
13
14     @Size(min = 6,max = 30,message = "地址应该在6-30字符之间")
15     private String address;
16
17     @DecimalMax(value = "100.00",message = "体重有些超标哦")
18     @DecimalMin(value = "60.00",message = "多吃点饭吧")
19     private BigDecimal weight;
20
21     private String friendName;
22     @AssertTrue
23     private Boolean isHaveFriend(){
24         return friendName != null?true:false;
25     }
26
27     @Future(message = "生日必须在当前实践之前")
28     private Date birthday;
29
30     @Pattern(regexp = "^(.+)@(.+)$",message = "邮箱的格式不合法")
31     private String email;
32
33
34     public String getName() {
35         return name;
36     }
37
38     public void setName(String name) {
39         this.name = name;
40     }
41
42     public String getAddress() {
43         return address;
44     }
45
46     public void setAddress(String address) {
47         this.address = address;
48     }
49
50     public BigDecimal getWeight() {
51         return weight;
52     }
53
54     public void setWeight(BigDecimal weight) {
55         this.weight = weight;
56     }
57
58     public String getFriendName() {
59         return friendName;
60     }
61
62     public void setFriendName(String friendName) {
63         this.friendName = friendName;
64     }
65
66     public Date getBirthday() {
67         return birthday;
68     }
69
70     public void setBirthday(Date birthday) {
71         this.birthday = birthday;
72     }
73
74     public String getEmail() {
75         return email;
76     }
77
78     public void setEmail(String email) {
79         this.email = email;
80     }
81 }

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、总结

  • 像@NotNull、@Size等比较简单也易于理解,不多说
  • @Pattern 因为这个是正则,所以能做的事情比较多,比如中文还是数字、邮箱、长度等等都可以做
  • @AssertTRue 这个与其他的校验注解有着本质的区别,因为与别的字段发生了关联。例子中isHaveFriend方法依赖friendName字段校验
  • 验证的api是经过我加工了一下,这样可以批量返回校验的信息
  • 这个框架还是比较简单的,有时我们需要的注解可能没有提供,这时候就需要自定义注解,字节写实现了。下一节会讨论下hibernate validation,
时间: 2024-08-06 05:03:05

JAVA validation 后台参数验证的相关文章

后台参数验证的几种方式

前言 参数验证是一个常见的问题,无论是前端还是后台,都需对用户输入进行验证,以此来保证系统数据的正确性.对于web来说,有些人可能理所当然的想在前端验证就行了,但这样是非常错误的做法,前端代码对于用户来说是透明的,稍微有点技术的人就可以绕过这个验证,直接提交数据到后台.无论是前端网页提交的接口,还是提供给外部的接口,参数验证随处可见,也是必不可少的.总之,一切用户的输入都是不可信的. 参数验证有许多种方式进行,下面以mvc为例,列举几种常见的验证方式,假设有一个用户注册方法 [HttpPost]

Java参数验证Bean Validation 框架

1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式.该规范主要使用注解的方式来实现对 Java Bean 的验证功能,并且这种方式会覆盖使用 XML 形式的验证描述符,从而使验证逻辑从业务代码中分离出来.JSR303注解如下: Hibernate

Java和C#下的参数验证

参数的输入和验证问题是开发时经常遇到的,一般的验证方法如下: public bool Register(string name, int age) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("name should not be empty", "name"); } if (age < 10 || age > 70) { throw new ArgumentExcept

参数验证 validation

参数验证功能是基于 JSR303 实现的,用户只需标识 JSR303 标准的验证 annotation,并通过声明 filter 来实现验证. Maven 依赖 <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency

SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用

1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1.1 GET 一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据 1.2 POST 一般用于插入数据 1.3 PUT 一般用于数据更新 1.4 DELETE 一般用于数据删除 技巧01:一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据) 2 参数获取注解 2.1

SpringBoot入门二十二,使用Validation进行参数校验

项目基本配置参考文章SpringBoot入门一,使用myEclipse新建一个SpringBoot项目,使用myEclipse新建一个SpringBoot项目即可,此示例springboot升级为2.2.1版本. 1. pom.xml添加aop支持 如果已经引用了spring-boot-starter-web,就不要需要引用spring-boot-starter-validation了,本例就不再引用 <!-- 引入validation支持 --> <dependency> <

jQuery学习之:Validation表单验证插件

http://polaris.blog.51cto.com/1146394/258781/ 最近由于公司决定使用AJAX + Struts2来重构项目,让我仔细研究一下这两个,然后集中给同事讲讲,让每个人都能够有所掌握,慢慢会用.于是,自己便开始学习…… 由于Struts2自己早就学过,因而不需要花多少时间.而AJAX之前没怎么用过.现在AJAX框架如此之多,选择哪一个呢?开始打算选择 dojo,但是看了一点后,发现蛮复杂的.在之前有学过一点点jQuery,而网上也说jQuery很强大而且很容易

淘宝SOA框架dubbo学习(4)--参数验证

1.由于没用maven,和对dubbo不是很了解的原因,这次,总因为jar包不对,而导致:dubbo客户端程序,启动不起来 所以决定:将原来用过的所有jar包全部去,将dubbo-demo-provider-2.5.4-SNAPSHOT/lib下的所有jar包全部导入项目中 一切就OK了 2.服务消费者代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证

Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 参数验证 参数验证功能是基于JSR303实现的,用户只需标识JSR303标准的验证Annotation,并通过声明filter来实现验证. 2.1.0以上版本支持 验证方式可扩展,参见:Validation扩展点 参数标注示例: import java.io.Serializable; import java.util.Date;   import javax.validatio