在上一篇文章中我們集成了swagger ui,搭建了一個restful風(fēng)格的接口礁芦,當(dāng)進(jìn)行邏輯處理的時候蜻韭,我們首先要做的想必一定是參數(shù)校驗(yàn),這篇文章描述了使用javax.validation進(jìn)行參數(shù)校驗(yàn)柿扣。
1.新建實(shí)體類肖方,加上javax.validation的注解
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
public class Student {
@Range(min = 18, max = 60, message = "年齡不合適")
private int age;
@NotBlank(message = "學(xué)校不能為空")
private String school;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
2.在controller進(jìn)行如下修改
@ApiImplicitParam(name = "student", value = "普通用戶", required = true, dataType = "Student")
@RequestMapping(value = "/second", method = RequestMethod.POST)
public Result test2(@RequestBody @Valid Student student, BindingResult bindingResult){
//在這里,我們判斷參數(shù)是否通過校驗(yàn)
if (bindingResult.hasErrors()) {
String message = bindingResult.getFieldError().getDefaultMessage();
//自定義的返回窄刘,并將錯誤信息返回
return Result.error(message);
}
return Result.commonSuccess();
}
javax.validation可用的注解
空檢查
@Null 驗(yàn)證對象是否為null
@NotNull 驗(yàn)證對象是否不為null, 無法查檢長度為0的字符串
@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格.
@NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
Booelan檢查
@AssertTrue 驗(yàn)證 Boolean 對象是否為 true
@AssertFalse 驗(yàn)證 Boolean 對象是否為 false
長度檢查
@Size(min=, max=) 驗(yàn)證對象(Array,Collection,Map,String)長度是否在給定的范圍之內(nèi)
@Length(min=, max=)
驗(yàn)證字符串的長度是否在給定的范圍之內(nèi)窥妇,包含兩端
日期檢查
@Past 驗(yàn)證 Date 和 Calendar 對象是否在當(dāng)前時間之前
@Future 驗(yàn)證 Date 和 Calendar 對象是否在當(dāng)前時間之后
@Pattern 驗(yàn)證 String 對象是否符合正則表達(dá)式的規(guī)則
數(shù)值檢查:建議使用在Stirng,Integer類型,不建議使用在int類型上娩践,因?yàn)楸韱沃禐椤啊睍r無法轉(zhuǎn)換為int活翩,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min 驗(yàn)證 Number 和 String 對象是否大等于指定的值
@Max 驗(yàn)證 Number 和 String 對象是否小等于指定的值
@DecimalMax 被標(biāo)注的值必須不大于約束中指定的最大值. 這個約束的參數(shù)是一個通過BigDecimal定義的最大值的字符串表示.小數(shù)存在精度
@DecimalMin 被標(biāo)注的值必須不小于約束中指定的最小值. 這個約束的參數(shù)是一個通過BigDecimal定義的最小值的字符串表示.小數(shù)存在精度
@Digits 驗(yàn)證 Number 和 String 的構(gòu)成是否合法
@Digits(integer=,fraction=) 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度翻伺,fraction指定小數(shù)精度材泄。
@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;
@Valid遞歸的對關(guān)聯(lián)對象進(jìn)行校驗(yàn), 如果關(guān)聯(lián)對象是個集合或者數(shù)組,那么對其中的元素進(jìn)行遞歸校驗(yàn),如果是一個map,則對其中的值部分進(jìn)行校驗(yàn).(是否進(jìn)行遞歸驗(yàn)證)
@CreditCardNumber信用卡驗(yàn)證
@Email 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證吨岭,算通過驗(yàn)證拉宗。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
3.當(dāng)然,有些時候我們還需要一些自定義的校驗(yàn)
編寫自定義校驗(yàn)注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target( {ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCheckImpl.class)
public @interface MyCheck {
String message() default "未知錯誤";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
實(shí)現(xiàn)類
import java.lang.annotation.Annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MyCheckImpl implements ConstraintValidator<Annotation, String>{
public void initialize(Annotation arg0) {
}
public boolean isValid(String arg0, ConstraintValidatorContext arg1) {
// 具體校驗(yàn)方法
if("男".equals(arg0)||"女".equals(arg0)){
return true;
}
return false;
}
}
在之前的實(shí)體類中使用我們的自定義校驗(yàn)