1. 程式人生 > >Bean Validation——自定義註解

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