java后台验证不能为空_java 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上維護,最新包的坐標如下:
javax.validation
validation-api
1.1.0.Final
點擊這里查看最新的坐標地址
下載之后打開這個包,有個package叫constraints,里面放的就是驗證的的注解:
下面開始用代碼實踐一下:
1、定義一個待驗證的bean:Student.java
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:fwww.cppcns.comalse;
}
@Future(message = "生日必須在當前實踐之前")
private Date birthday;
@Pattern(regexp = "^(.+)@(.+)$",message = "郵箱的格式不合法")
private String email;
2、測試類:StudentTest.java
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 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 List validate(T t) {
Validator validaYtIDqItigotor = factory.getValidator();
Set> constraintViolations = validator.validate(t);
List messageList = new ArrayList<>();
for (ConstraintViolation constraintViolation : constraintViolations) {
messageList.add(constraintViolation.getMessage());
}
return messageList;
}
}
3、運行testValidation()方法,輸處如下:
地址應該在6-30字符之間
郵箱的格式不合法
生日必須在當前時間之前
多吃點飯吧
名字不能為空
4、總結
像@NotNull、@Size等比較簡單也易于理解,不多說
因為bean validation只提供了接口并未實現,使用時需要加上一個provider的包,例如hibernate-validator
@Pattern 因為這個是正則,所以能做的事情比較多,比如中文還是數字、郵箱、長度等等都可以做
@AssertTRue 這個與其他的校驗注解有著本質的區別,這個注解適用于多個字段。例子中isHaveFriend方法依賴friendName字段校驗
驗證的api是經過我加工了一下,這樣可以批量返回校驗的信息
有時我們需要的注解可能沒有提供,這時候就需要自定義注解,寫實現類,下面說一下自定義注解的使用
四、自定義bean 編程客棧validation 注解驗證
有時框架自帶的沒法滿足我們的需求,這時就需要自己動手豐衣足食了,恩恩 ,這個不難,下面說下。
這個例子驗證字符串是大寫還是小寫約束標注,代碼如下:
1、枚舉類型CaseMode, 來表示大寫或小寫模式
package com.defineconstrain;
/**
* created by xiaogangfan
* on 16/10/25.
*/
public enum CaseMode {
UPPER,
LOWER;
}
2、定義一個CheckCase的約束標注
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的驗證器
package com.defineconstrain;
/**
* created by xiaogangfan
* on 16/10/25.
*/
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CheckCaseValidator implements ConstraintValidator {
private CaseMode caseMode;
public void initialize(CheckCase constraintAnnotation) {
this.caseMode = constraintAnnotation.value();
}
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
www.cppcns.com if (object == null)
return true;
if (caseMode == CaseMode.UPPER)
return object.equals(object.toUpperCase());
else
return object.equals(object.toLowerCase());
}
}
4、在Student.java中增加一個屬性
@CheckCase(value = CaseMode.LOWER,message = "名字的拼音需要小寫")
private String spellName;
5、在StudentTest.java的getBean()方法中增加一行
bean.setSpellName("XIAOGANGFAN");
6、運行testValidation()方法,輸處如下:
地址應該在6-30字符之間
郵箱的格式不合法
生日必須在當前時間之前
多吃點飯吧
名字的拼音需要小寫
名字不能為空
7、說明新增的約束生效了,大功告成
代碼下載地址:git@github.com:xiaogangfan/vaidation.git
命令: git clone git@github.com:xiaogangfan/vaidation.git
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
本文標題: java validation 后臺參數驗證的使用詳解
本文地址: http://www.cppcns.com/ruanjian/java/207528.html
總結
以上是生活随笔為你收集整理的java后台验证不能为空_java validation 后台参数验证的使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国电科回应网传事件:非集团公司所属成员
- 下一篇: 让机器人学会咖啡拉花,得从流体力学搞起,