java自定義注解的使用(校驗)


1. 自定義注解須知
首先,自定義注解我們必須了解四個元注解,什么是元注解?元注解指作用於注解之上的元數據或者元信息,簡單通俗的講,元注解就是注解的注解 .

Documented與Inherited是典型的標識性注解,也就是說在注解內部並沒有成員變量,沒有成員變量的注解稱為標識注解 

 Documented
指明擁有這個注解的元素可以被javadoc此類的工具文檔化。這種類型應該用於注解那些影響客戶使用帶注釋的元素聲明的類型。如果一種聲明使用Documented進行注解,這種類型的注解被作為被標注的程序成員的公共API 。

 Inherited
指明該注解類型被自動繼承。如果用戶在當前類中查詢這個元注解類型並且當前類的聲明中不包含這個元注解類型,那么也將自動查詢當前類的父類是否存在Inherited元注解,這個動作將被重復執行知道這個標注類型被找到,或者是查詢到頂層的父類。

 Retention
指明在什么級別顯示此注解

Retention主要的參數類型包括以下幾種:

RetentionPolicy.SOURCE 注解存在於源代碼中,編譯時會被拋棄

RetentionPolicy.CLASS 注解會被編譯到class文件中,但是JVM會忽略

RetentionPolicy.RUNTIME JVM會讀取注解,同時會保存到class文件中

 Target
指明該類型的注解可以注解的程序元素的范圍

Target主要的參數類型包括以下幾種:

ElementType.TYPE 用於類,接口,枚舉但不能是注解

ElementType.FIELD 作用於字段,包含枚舉值

ElementType.METHOD 作用於方法,不包含構造方法

ElementType.PARAMETER 作用於方法的參數

ElementType.CONSTRUCTOR 作用於構造方法

ElementType.LOCAL_VERIABLE 作用於本地變量或者catch語句

ElementType.ANNOTATION_TYPE 作用於注解

ElementType.PACKAGE 作用於包
2.應用

創建一個注解類(作用於字段)

package com.insert.sql.fruit;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = SipValidator.class)
public @interface Sip {
String message() default "Sip賬號格式不正確";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};
}

創建一個校驗邏輯的類

package com.insert.sql.fruit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* @Description 驗證Sip賬號是否正確
* @ClassName SipValidator
**/
public class SipValidator implements ConstraintValidator<Sip, String> {
private static final Logger logger = LoggerFactory.getLogger(EmailValidator.class);

public void initialize(Sip constraint) {
}

public boolean isValid(String sip, ConstraintValidatorContext context) {
if (sip.equals("")) {
logger.error("Sip賬號不能為空");
return false;
}
String reg1 = "sip:\\+.*@ims.ge.chinamobile.com";
Pattern pattern = Pattern.compile(reg1);
Matcher matcher = pattern.matcher(sip);
boolean matches = matcher.matches();
return matches;
}
}

創建一個model類(屬性上加上我們的自定義注解)
@Sip
private String sip;

此時就可以對該屬性進行校驗了。
正確如下

錯誤如下

 

 返回的格式可以再控制器里封裝(如下)

@RequestMapping("/age")
public Object getAge(@Valid Apple apple, BindingResult validateResult) {
String s = JSON.toJSONString(apple);
System.out.println(s);
if (validateResult.hasErrors()) {
return new ErrorEntity(-1, validateResult.getAllErrors().get(0).getDefaultMessage());
}
return "requst success!!!";
}

 

創建一個注解類(作用於類)

 

 使用

 

 參數

 結果

 



大功告成!!!!!!!!!!!!!!
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM