Bean Validation——自定義註解
在Bean Validation中,除了可以使用現成的校驗註解之外,我們還可以在其中自定義自己的程式碼註解校驗規則。
自定義註解——Email
下面是展示的自定義註解,實現的功能是對於電子郵箱的校驗。
建立註解介面Email
package com.lyc.valueExtractor;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.PARAMETER}) // 約束註解應用的目標元素型別(METHOD, FIELD, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER等)
@Retention(RetentionPolicy.RUNTIME) // 約束註解應用的時機
@Documented
@Constraint(validatedBy ={EmailValidator.class}) // 與約束註解關聯的驗證器
public @interface Email {
String message() default "這不是有效的電子郵件格式"; // 約束註解驗證時的輸出訊息
Class<?>[] groups() default { }; // 約束註解在驗證時所屬的組別
Class<? extends Payload>[] payload() default { }; // 約束註解的有效負載
/**
* 郵箱的驗證規則
* @return
*/
String regexp() default "[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9]+\\.[a-zA-Z]{2,4}";
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.PARAMETER}) // 約束註解應用的目標元素型別(METHOD, FIELD, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER等)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
Email[] value();
}
}
建立註解的實現類EmailValidator
package com.lyc.valueExtractor;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailValidator implements ConstraintValidator<Email,String> {
private String regexp;
@Override
public void initialize(Email constraintAnnotation) {
this.regexp = constraintAnnotation.regexp();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null){
return true;
} else if (value.matches(regexp)){
return true;
}
return false;
}
}
建立應用自定義註解Email的實體類Person2
package com.lyc.validator.entity;
import com.lyc.valueExtractor.Email;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class Person2 {
@Email
private String email;
}
建立測試程式碼Person2Test
package com.lyc.valueExtractor;
import com.lyc.validator.entity.Person2;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
@Slf4j
public class Person2Test {
private static Validator validator;
@BeforeClass
public static void setUpVolidator(){
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = (Validator) validatorFactory.getValidator();
}
@Test
public void manufacturerNull(){
Person2 person2 = new Person2("[email protected]@163.com");
Set<ConstraintViolation<Person2>> constraintViolations = validator.validate(person2);
Assert.assertEquals(1,constraintViolations.size());
String errorMessage = constraintViolations.iterator().next().getMessage();
log.info(errorMessage);
Assert.assertEquals("這不是有效的電子郵件格式",errorMessage);
}
}
自定義註解Number
下面是展示的自定義註解,實現的功能是對於輸入的數值校驗。
建立註解介面Number
package com.lyc.valueExtractor;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.PARAMETER}) // 約束註解應用的目標元素型別(METHOD, FIELD, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER等)
@Retention(RetentionPolicy.RUNTIME) // 約束註解應用的時機
@Documented
@Constraint(validatedBy ={NumberValidator.class}) // 與約束註解關聯的驗證器
public @interface Number {
String message() default "該值應該為數字"; // 約束註解驗證時的輸出訊息
Class<?>[] groups() default { }; // 約束註解在驗證時所屬的組別
Class<? extends Payload>[] payload() default { }; // 約束註解的有效負載
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.CONSTRUCTOR,ElementType.PARAMETER}) // 約束註解應用的目標元素型別(METHOD, FIELD, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER等)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
Number[] value();
}
}
建立註解的實現類NumberValidator
package com.lyc.valueExtractor;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class NumberValidator implements ConstraintValidator<Number,Object> {
@Override
public void initialize(Number constraintAnnotation) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if(value == null){
return true;
} else {
//數字型別的轉換必須得拋異常
if(isNumber(value)){
return true;
}
return false;
}
}
private boolean isNumber(Object value){
NumberHolder numberHolder = new NumberHolder();
return numberHolder.checkNember(value);
}
}
建立數值判斷類NumberHolder
package com.lyc.valueExtractor;
public class NumberHolder {
protected boolean checkNember(Object value) {
JudgeNumber judgeNumber = new JudgeNumber();
if(judgeNumber.isNumber(value)){
return true;
} else if(value instanceof String){
String str = (String) value;
if (judgeNumber.isNumber(str)){
return true;
}
}
return false;
}
}
建立資料型別判斷泛型類JudgeNumber
package com.lyc.valueExtractor;
public class JudgeNumber<T> {
public boolean isNumber(T value){
if(value instanceof Integer){
Integer integer = (Integer) value;
return true;
} else if(value instanceof Long){
Long longValue= (Long) value;
return true;
} else if(value instanceof Double){
Double doubleValue = (Double) value;
return true;
} else if(value instanceof Float){
Float floatValue = (Float) value;
return true;
}
return false;
}
}
建立應用註解Number的實體類Person
package com.lyc.validator.entity;
import com.lyc.valueExtractor.Number;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class Person {
@Number(message= "體重必須為數字") //該註解為自定義註解
private String weight;
@Number(message= "體重必須為數字") //該註解為自定義註解
private Integer weight2;
@Number(message= "體重必須為數字") //該註解為自定義註解
private Double weight3;
@Number(message= "體重必須為數字") //該註解為自定義註解
private Long weight4;
@Number(message= "體重必須為數字") //該註解為自定義註解
private Float weight5;
}
建立Person的測試類PersonTest
package com.lyc.valueExtractor;
import com.lyc.validator.entity.Person;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
@Slf4j
public class PersonTest {
private static Validator validator;
@BeforeClass
public static void setUpVolidator(){
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = (Validator) validatorFactory.getValidator();
}
@Test
public void manufacturerNull(){
Person person = new Person("12s",12,12D,12L,12F);
Set<ConstraintViolation<Person>> constraintViolations = validator.validate(person);
Assert.assertEquals(1,constraintViolations.size());
String errorMessage = constraintViolations.iterator().next().getMessage();
log.info(errorMessage);
Assert.assertEquals("體重必須為數字",errorMessage);
}
}
相關推薦
Bean Validation——自定義註解
在Bean Validation中,除了可以使用現成的校驗註解之外,我們還可以在其中自定義自己的程式碼註解校驗規則。 自定義註解——Email 下面是展示的自定義註解,實現的功能是對於電子郵箱的校驗。 建立註解介面Email package
Hibernate Validation自定義註解校驗
權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/cccmercy/article/details/79105624 情景:需要對String型別的屬性比如description進行驗證,驗證規則是當descript
hiberbate validation 自定義註解
Hibernate Validator 是 Bean Validation 的參考實現 。Hibernate Validator 提供了 JSR 303 規範中所有內建 constraint 的實現,除此之外還有一些附加的 constraint。 1.maven中引入hibernate-va
validation 自定義註解統一校驗列舉型別
請大神們多多指點評論,不勝感激,有問題也可以評論提問1.自定義介面 @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPoli
hibernate validation內置註解及自定義註解
ons private from decimal 最重要的 con name cts mva 1 Bean Validation 中內置的 constraint 2 @Null 被註釋的元素必須為 null 3 @NotNull
使用自定義註解向servlet注入spring bean
由於servlet容器和spring容器並不是同一個,所以當需要向servlet中注入spring bean是有以下操作: 1、使用proxy servlet(代理servlet),將實際servlet加入spring bean管理,在代理servlet的in
Spring 關於bean的獲取以及自定義註解的起始注入和獲取
最近有收穫了一點東西,特來記錄。假設一個場景,一個學生的學習計劃根據其不同的人,和學習內容有不同的結果,和處理方式。按照我們正常的寫法,應該是就是構造一個’內容‘介面。例如 public interface PersonAnnotationService {
掃描自定義註解並在spring容器中注入自定義bean
開發十年,就只剩下這套架構體系了! >>>
Java自定義註解反射校驗數據
sda new out 格式 是否 本地 imp 使用範圍 數據類型 package com.annotations.ecargo; import java.lang.annotation.ElementType; import java.lang.annotati
java自定義註解
不包含 doc 1.2 color 子類 局部變量 ati 包含 ant Java註解是附加在代碼中的一些元信息,用於一些工具在編譯、運行時進行解析和使用,起到說明、配置的功能。註解不會也不能影響代碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annot
AOP通過反射獲取自定義註解
ram tar .get tty sig runt type log eth 自定義註解: @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component
自定義註解的簡單使用
microsoft report val 取數 nds 表示 package 自定義註解 tco 框架開發時不免會涉及到配置文件,如properties、xml以及txt等格式的文件。這裏介紹框架中通過自定義註解的形式簡化配置: 根據需求編寫自定
自定義註解框架的那些事
構造 -i 靜態 cti tails cas 數組 講解 調用 一、前言 距離上次更新已過一個半月,工作太忙也不是停更的理由。我這方面做得很不好,希望大家給予監督。首先會講解【編譯期資源註入】,接著是【下拉刷新註入】(通過註解來實現下拉刷新功能),最後打造一款【特色的註解框
動態代理中的自定義註解樣式
interface pre 運行期 type import 生存 nbsp pub tar 動態代理中的自定義註解的樣式 @Target(ElementType.METHOD) 代表此註解使用對象是method@Retention(RetentionPolicy.RU
JAVA中如何定義自定義註解
name 成員 ons javaoop override dep 擁有 ride 不能 了解註解 註解是Java1.5,JDK5.0引用的技術,與類,接口,枚舉處於同一層次 。它可以聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,註釋 。 在J
spring mvc實現自定義註解
poi org param 運行時 onf dha ogg logs exec 實現方式:使用@Aspect實現: 1. 新建註解接口:CheckSign package com.soeasy.web.utils; import org.springframework.
自定義註解
什麽 特征 print [] java開發 pro 編號 isp info 什麽是註解? 對於很多初次接觸的開發者來說應該都有這個疑問?Annontation是Java5開始引入的新特征,中文名稱叫註解。它提供了一種安全的類似註釋的機制,用來將任何的信息或元數據
使用自定義註解和反射 ,自動生成查詢語句
runt entity forname == rop ava stat pri string 1.自定義表名註解 package com.lf.annotation; import java.lang.annotation.ElementType; import jav
SpringMVC攔截器和自定義註解
tor spring system image ssi 定義 技術分享 style gets 一、攔截器 1、攔截所有URL <mvc:interceptors> <bean class="myInterceptor.MyIntercept
Java的自定義註解及通過反射獲取註解
tco element pos pri jvm ado 參數聲明 機制 world 一、註解基本知識 1、元註解:@Retention @Target @Document @Inherited 2、Annotation型定義為@interface, 所有的Annot