1. 程式人生 > >自定義hibernate validation註解

自定義hibernate validation註解

效果和優點

先看最後效果:

public class UserEntity {

    @Password  
    private String password;
    @Email
    private String email;

}

上面使用了兩個自定義的註解來驗證password和email,這樣做的好處是:一處定義,處處使用,要修改驗證規則時,也只要修改註解就可以了。而如果自定義,使用hibernate提供的標籤的話:

@Pattern(regexp="...")
private String email;

如果寫了很多個類之後,突然要修改驗證規則regexp,此時工作量將要大得多。

實現

首先,引入hibernate validation依賴,新增:

    <!-- hibernate validator -->
    <!-- hibernate 驗證框架 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.2.2.Final</version
>
</dependency>

hibernate validation是JSR的參考實現,所以,用它做bean驗證。

自定義一個驗證註解分為三步:

  • 建立註解(Create a constraint annotation)
  • 建立驗證類(Implement a validator)
  • 定義預設錯誤資訊(Define a default error message)

    第一步,建立註解:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { EmailValidator.class }) public @interface Email { String message() default "這不是有效的電子郵件格式"; /** * @return the regular expression to match */ String regexp() default "[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9]+\\.[a-zA-Z]{2,4}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; /** * Defines several {@link Size} annotations on the same element. * * @see Size */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @interface List { Email[] value(); } }

通過@interface關鍵字來建立註解,而每一個方法就是註解的一個引數。比如上面的程式碼,就可以這樣使用@Email(regexp="...",message="...")。其它可以不用去管,直接複製就可以了,要注意的是@Constraint(validatedBy = { EmailValidator.class }),這裡指定註解的驗證類,根據實際替換類名。

第二步,建立驗證類:

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;}
        if( value.matches(regexp)){
            return true;
        }
        return false;
    }

}

這裡只要實現ConstraintValidator<Email, String>介面就建立了一個驗證器。initialize方法得到註解的regexp值,在isValid方法中進行驗證,符合正則表示式就返回true,否則返回false。

需要注意的是,當value為空,也就是驗證的物件沒有初始化的時候,要編寫相應的驗證規則,不然會報錯的。在上面程式碼中編寫的是:

if(value==null){return true;}

也即是,當驗證物件為空時,返回成功。

第三步是編寫預設錯誤資訊。其實這一步在第一步已經做了,通過default,所以這步不用做。

3、常見錯誤:
HV000030: No validator could be found for type
原因一般是沒有設定@Constraint(validatedBy = { EmailValidator.class })

if(value==null){return true;}

相關推薦

定義hibernate validation註解

效果和優點 先看最後效果: public class UserEntity { @Password private String password; @Email private String email; }

定義Hibernate Validator校驗註解

定義註解 package com.futao.springmvcdemo.annotation; import com.futao.springmvcdemo.annotation.impl.IllegalValueCheckImpl; import c

spring:定義限定符註解@interface, 首選bean

限定符 喜歡 class autowire bean interface 通過 自動 .... spring:自定義限定符註解@interface, 首選bean 1.首選bean 在聲明bean的時候,通過將其中一個可選的bean設置為首選(primary)bean能夠避

jsr-303 參數校驗—定義校驗註解

nbsp 們的 else spa efault ssa password 為什麽 ini 1、為什麽要自定義? 通過上篇學習,了解到很多常用註解了,但是呢,總是有那麽些需求.... 2、案例分析(手機號格式) 2.1、需要驗證的實體 Bean pu

定義JSR validation及Swagger的一些坑

地址:https://blog.csdn.net/z28126308/article/details/77748798 http://sishuok.com/forum/blogPost/list/7798.html   JSR-Java Specification Reque

Bean Validation設定校驗失敗全域性返回資訊(續定義JSR validation)

demo網址在上一篇有,這篇寫如何定義validation驗證失敗後的返回資訊。 (截圖源於上篇) 由下圖看出驗證失敗後Swagger會丟擲一堆錯誤資訊,但其實前端要的只是錯誤的欄位資訊,即一般我們只需返回錯誤欄位的資訊,下面為上紅框異常類的原始碼: public class

@Constraint註解配合定義驗證型別註解的開發

前言:雖然現在有很多很有用的驗證註解,如@not null,@not blank,@not [email protected]等等。但是我們可能有時候根據專案的拓展這些驗證註解不夠用,那怎麼辦,解決的辦法就是自定義驗證註解   1,@Constraint註解 說到自定

通過定義spring invalidator註解校驗資料合法性

在專案中經常會對使用者輸入的資料,或者外部匯入到系統的資料做合法性檢查。在spring boot框架的微服務中可以使用invalidator註解對資料做合法性,安全性校驗。下面給一個樣例說明如何自定義註解實現校驗邏輯。 一、定義校驗屬性字串長度的註解 packa

隨筆(八) 定義redis快取註解(基於springboot)

前言:            最近專案開發中需要使用redis快取為資料庫降壓。由於在構建系統時沒有使用快取,後期加入快取的時候不想對業務程式碼上新增,造成程式碼入侵,所有封裝了一套自定義快取類,處理快取。 開發環境:          win10+Intelli

定義校驗註解

平時專案中使用的@NotNull,@Pattern等校驗註解進行校驗,自己也可以針對要實現的邏輯進行自定義註解。 1.可以參照著@NotNull註解設計一個註解類 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER

struts2定義攔截器註解配置方法

自定義攔截器: package com.penjing.interceptor; import javax.servlet.http.HttpServletRequest; import net.sf.json.JSONObject; import

spring boot 定義校驗註解

建立註解 import cn.wyj.validation.SpecificIntegerConstraintValidator; import javax.validation.Constrai

定義Hibernate Dialect解決createSQLQuery時的decimal,long

org.hibernate.MappingException: No Dialect mapping for JDBC type: 3仔細檢視,發現問題在於資料型別.到網上查,發現hibernate在執行List result = session.createSQLQuery

SpringBoot學習 —— 定義校驗註解

自定義校驗註解在系統使用過程中,有很多地方需要對手機號的格式進行校驗,如:註冊、驗證碼傳送等。但校驗手機號的正則表示式又過於複雜,如果多處編寫,一旦運營商增加某個號段,對程式的維護人員來說就是一個噩耗。這時,可以使用自定義校驗註解來代替這些常用的校驗。手機號校驗實現類 Pho

######Spring第5天ssh整合(註解版)難理解知識點:【定義 方法加註解的方式】給dao注入sessionFactory屬性+【搞清@Autowared和@Resource含義】

===【方法加註解的方式】給dao注入sessionFactory屬性(繼承父類的屬性),第一次見!===具體怎麼用的,看原始碼。(後面有寫) 以前都是屬性+註解注入屬性。 [email protected]和@Resource到底是幹嘛的? 剛學IOC時可能能

13)SpringBoot 請求方式、引數獲取註解、引數驗證、前後臺屬性名不一致問題、定義引數驗證註解、BeanUtils的使用

1 請求方式   在定義一個Rest介面時通常會利用GET、POST、PUT、DELETE來實現資料的增刪改查;這幾種方式有的需要傳遞引數,後臺開發人員必須對接收到的引數進行引數驗證來確保程式的健壯性   1.1 GET     一般用於查詢資料,採用明文進行傳

JVM系列六(定義插入式註解器).

一、概述 從前面 文章 中我們可以瞭解到,javac 的三個步驟中,程式設計師唯一能干預的就是註解處理器部分,註解處理器類似於編譯器的外掛,在這些外掛裡面,可以讀取、修改、新增抽象語法樹中的任意元素。因此,只要有足夠的創意,程式設計師可以通過自定義插入式註解處理器來實現許多原本只能在編碼中完成的事情。我們常見

定義校驗註解ConstraintValidator

# 一 前言 系統執行業務邏輯之前,會對輸入資料進行校驗,檢測資料是否有效合法的。所以我們可能會寫大量的if else等判斷邏輯,特別是在不同方法出現相同的資料時,校驗的邏輯程式碼會反覆出現,導致程式碼冗餘,閱讀性和可維護性極差。 鑑於通用性和普遍性,Spring框架提供了validator元件,通過一些

hibernate validation內置註解定義註解

ons private from decimal 最重要的 con name cts mva 1 Bean Validation 中內置的 constraint 2 @Null 被註釋的元素必須為 null 3 @NotNull

Hibernate Validation定義註解校驗

權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/cccmercy/article/details/79105624 情景:需要對String型別的屬性比如description進行驗證,驗證規則是當descript