java注解验证_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 {};

}

af49a1b994a95785275786e7034883ea.png

创建一个校验逻辑的类

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 {

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;

}

}

e0b222900fb3c99eb3fa5be3186e8bd8.png

创建一个model类(属性上加上我们的自定义注解)

@Sip

private String sip;

此时就可以对该属性进行校验了。

正确如下

0a4b11b647fe5063fc502dc6f3f359a4.png

错误如下

c94252295fedf52aaddfea91ba7da41c.png

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

@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!!!";

}

d08d741e8f469b64553f6f949fffe59e.png

创建一个注解类(作用于类)

be17000979e64dbabc7177f024daa086.png

22d12ba2b0cf67ee5b614f8f2cc9c4c8.png

c1bfef96fab9809d668eac1e0599c688.png

使用

2a0d8b86ad8cc9c87b58418cbf9d3f09.png

参数

6eb7918f82925bf7262aff78209dfd09.png

结果

1d54b63fe495316f8f7b0242a63948f8.png

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值