1. 程式人生 > >Java 註解校驗

Java 註解校驗

石上
記錄、分享
java bean 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

javax.validation
validation-api
1.1.0.Final

   點選這裡檢視最新的座標地址

下載之後開啟這個包,有個package叫constraints,裡面放的就是驗證的的註解:

在這裡插入圖片描述

下面開始用程式碼實踐一下:

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

複製程式碼
1 package com.shishang;
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

View Code
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的驗證器

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

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

bean.setSpellName(“XIAOGANGFAN”);
  6、執行testValidation()方法,輸處如下:

地址應該在6-30字元之間
郵箱的格式不合法
生日必須在當前時間之前
多吃點飯吧
名字的拼音需要小寫
名字不能為空
  7、說明新增的約束生效了,大功告成

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

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