一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java validation 后臺參數(shù)驗證的使用詳解

java validation 后臺參數(shù)驗證的使用詳解

2021-01-22 11:21范曉剛 Java教程

本篇文章主要介紹了java validation 后臺參數(shù)驗證的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、前言

后臺開發(fā)過程中,對參數(shù)的校驗成為開發(fā)環(huán)境不可缺少的一個環(huán)節(jié)。比如參數(shù)不能為null,email那么必須符合email的格式,如果手動進行if判斷或者寫正則表達式判斷無意開發(fā)效率太慢,在時間、成本、質(zhì)量的博弈中必然會落后。所以把校驗層抽象出來是必然的結(jié)果,下面說下幾種解決方案。

二、幾種解決方案

1、struts2的valid可以通過配置xml,xml中描述規(guī)則和返回的信息,這種方式比較麻煩、開發(fā)效率低,不推薦

2、validation bean 是基于JSR-303標準開發(fā)出來的,使用注解方式實現(xiàn),及其方便,但是這只是一個接口,沒有具體實現(xiàn).Hibernate Validator是一個hibernate獨立的包,可以直接引用,他實現(xiàn)了validation bean同時有做了擴展,比較強大 ,實現(xiàn)圖如下:

java validation 后臺參數(shù)驗證的使用詳解

點此查看中文官方手冊

3、oval 是一個可擴展的Java對象數(shù)據(jù)驗證框架,驗證的規(guī)則可以通過配置文件、Annotation、POJOs 進行設定。可以使用純 Java 語言、JavaScript 、Groovy 、BeanShell 等進行規(guī)則的編寫,本次不過多講解

三、bean validation 框架驗證介紹

bean validation 包放在maven上維護,最新包的坐標如下:

?
1
2
3
4
5
6
7
8
9
<dependency>
 
  <groupId>javax.validation</groupId>
 
  <artifactId>validation-api</artifactId>
 
  <version>1.1.0.Final</version>
 
</dependency>

 點擊這里查看最新的坐標地址

下載之后打開這個包,有個package叫constraints,里面放的就是驗證的的注解:

java validation 后臺參數(shù)驗證的使用詳解  

下面開始用代碼實踐一下:

1、定義一個待驗證的bean:Student.java

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.shishang;
 
import javax.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
 
public class Student implements Serializable {
 
 
  @NotNull(message = "名字不能為空")
  private String name;
 
  @Size(min = 6,max = 30,message = "地址應該在6-30字符之間")
  private String address;
 
  @DecimalMax(value = "100.00",message = "體重有些超標哦")
  @DecimalMin(value = "60.00",message = "多吃點飯吧")
  private BigDecimal weight;
 
  private String friendName;
  @AssertTrue
  private Boolean isHaveFriend(){
    return friendName != null?true:false;
  }
 
  @Future(message = "生日必須在當前實踐之前")
  private Date birthday;
 
  @Pattern(regexp = "^(.+)@(.+)$",message = "郵箱的格式不合法")
  private String email;
 
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public String getAddress() {
    return address;
  }
 
  public void setAddress(String address) {
    this.address = address;
  }
 
  public BigDecimal getWeight() {
    return weight;
  }
 
  public void setWeight(BigDecimal weight) {
    this.weight = weight;
  }
 
  public String getFriendName() {
    return friendName;
  }
 
  public void setFriendName(String friendName) {
    this.friendName = friendName;
  }
 
  public Date getBirthday() {
    return birthday;
  }
 
  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }
 
  public String getEmail() {
    return email;
  }
 
  public void setEmail(String email) {
    this.email = email;
  }
}

2、測試類:StudentTest.java

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.use;
 
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
 
public class StudentTest implements Serializable {
  public static void main(String[] args) {
    Student xiaoming = getBean();
    List<String> validate = validate(xiaoming);
    validate.forEach(row -> {
      System.out.println(row.toString());
    });
 
  }
 
  private static Student getBean() {
    Student bean = new Student();
    bean.setName(null);
    bean.setAddress("北京");
    bean.setBirthday(new Date());
    bean.setFriendName(null);
    bean.setWeight(new BigDecimal(30));
    bean.setEmail("xiaogangfan163.com");
    return bean;
  }
 
  private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
 
  public static <T> List<String> validate(T t) {
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);
 
    List<String> messageList = new ArrayList<>();
    for (ConstraintViolation<T> constraintViolation : constraintViolations) {
      messageList.add(constraintViolation.getMessage());
    }
    return messageList;
  }
}

3、運行testValidation()方法,輸處如下:

  1. 地址應該在6-30字符之間
  2. 郵箱的格式不合法
  3. 生日必須在當前時間之前
  4. 多吃點飯吧
  5. 名字不能為空

4、總結(jié)

  1. 像@NotNull、@Size等比較簡單也易于理解,不多說
  2. 因為bean validation只提供了接口并未實現(xiàn),使用時需要加上一個provider的包,例如hibernate-validator
  3. @Pattern 因為這個是正則,所以能做的事情比較多,比如中文還是數(shù)字、郵箱、長度等等都可以做
  4. @AssertTRue 這個與其他的校驗注解有著本質(zhì)的區(qū)別,這個注解適用于多個字段。例子中isHaveFriend方法依賴friendName字段校驗
  5. 驗證的api是經(jīng)過我加工了一下,這樣可以批量返回校驗的信息
  6. 有時我們需要的注解可能沒有提供,這時候就需要自定義注解,寫實現(xiàn)類,下面說一下自定義注解的使用

四、自定義bean validation 注解驗證

有時框架自帶的沒法滿足我們的需求,這時就需要自己動手豐衣足食了,恩恩 ,這個不難,下面說下。

這個例子驗證字符串是大寫還是小寫約束標注,代碼如下:

1、枚舉類型CaseMode, 來表示大寫或小寫模式

?
1
2
3
4
5
6
7
8
9
10
package com.defineconstrain;
 
/**
 * created by xiaogangfan
 * on 16/10/25.
 */
public enum CaseMode {
  UPPER,
  LOWER;
}

2、定義一個CheckCase的約束標注

?
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
package com.defineconstrain;
 
/**
 * created by xiaogangfan
 * on 16/10/25.
 */
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
 
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
 
import javax.validation.Constraint;
import javax.validation.Payload;
 
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class)
@Documented
public @interface CheckCase {
 
  String message() default "{com.mycompany.constraints.checkcase}";
 
  Class<?>[] groups() default {};
 
  Class<? extends Payload>[] payload() default {};
 
  CaseMode value();
 
}

3、約束條件CheckCase的驗證器

?
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
package com.defineconstrain;
 
/**
 * created by xiaogangfan
 * on 16/10/25.
 */
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
 
public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {
 
  private CaseMode caseMode;
 
  public void initialize(CheckCase constraintAnnotation) {
    this.caseMode = constraintAnnotation.value();
  }
 
  public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
 
    if (object == null)
      return true;
 
    if (caseMode == CaseMode.UPPER)
      return object.equals(object.toUpperCase());
    else
      return object.equals(object.toLowerCase());
  }
 
}

4、在Student.java中增加一個屬性

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

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

?
1
bean.setSpellName("XIAOGANGFAN");

6、運行testValidation()方法,輸處如下:

  1. 地址應該在6-30字符之間
  2. 郵箱的格式不合法
  3. 生日必須在當前時間之前
  4. 多吃點飯吧
  5. 名字的拼音需要小寫
  6. 名字不能為空

7、說明新增的約束生效了,大功告成

代碼下載地址:[email protected]:xiaogangfan/vaidation.git

命令: git clone [email protected]:xiaogangfan/vaidation.git

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/xiaogangfan/p/5987659.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.久久av.com| 亚洲123区| 成人免费视频一区二区 | ipx358cn出差被男上司在线 | 国产成人免费高清激情视频 | 丝瓜草莓香蕉绿巨人幸福宝 | 亚洲精品综合网 | 亚洲国产中文字幕在线视频综合 | 亚洲欧美成人中文在线网站 | 亚洲成年网站在线777 | 亚洲激情网 | 色戒真做gif动图 | 99人中文字幕亚洲区 | 欧美国产日本精品一区二区三区 | 日韩视频在线精品视频免费观看 | 国产亚洲人成网站天堂岛 | 女人是男人的未来1分49分 | 2022国产麻豆剧果冻传媒入口 | 国产伊人久久 | 被夫上司侵犯了中文字幕 | 人人人人人看碰人人免费 | 高清视频免费 | 日本人成大片在线 | 欧美 亚洲 一区 | 欧美视| 精精国产xxxx视频在线播放器 | 国内精品久久久久影院网站 | 久久国产精品福利影集 | 处女摘花视频 | 日本高清全集免费观看 | 日韩在线二区 | 草莓视频看污 | 国产小情侣自拍 | 亚洲午夜精品久久久久 | 欧美艳星kagneyiynn | 国产成人精品实拍在线 | 视频网站入口在线看 | 国产一卡2卡3卡四卡高清 | 午夜精品久久久久久久99 | 国产精品酒店视频免费看 | 日韩一区在线观看 |