notnull注解_Hibernate Validator 第19篇:自定义约束-约束注解

本文介绍了如何在Hibernate Validator中创建自定义约束注解,包括定义CaseMode枚举、创建CheckCase注解及其属性,以及注解的元数据和使用场景。通过实例演示了如何确保字符串只包含大写或小写字母。
摘要由CSDN通过智能技术生成
7e8942385e6053d3760b33cab968d17f.png

Bean Validation API定义了一整套标准的约束注解,例如@NotNull,@Size等等。这种情况下,这些内建的约束是不够的,你可以很容易地创建自定义的约束,根据你自己的校验需要。

首先

为了建立一个自定义约束,

下面的三个步骤是必须的:

  • 创建一个约束注解;
  • 实现一个校验器;
  • 定一个默认的error message。

一、约束注解

展示写一个约束注解,这个注解的作用是保证被给定的字符串完全是大写,或者是小写字母。之后这个注解会被应用到Car类中的licensePlate字段上,来保证这个域值总是大写的字符串。

首先第一步要做的事是定义一种方式,表达两种字符模式,这里你可以使用String约束,一个更好的方式是使用枚举值:

public enum CaseMode {    UPPER,    LOWER;}

第二步是定义事实伤的约束注解。如果你之前从没定义过注解,这可能看起来有点小害怕,不过事实上它一点也不难。

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.ElementType.PARAMETER;import static java.lang.annotation.ElementType.TYPE_USE;import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE })@Retention(RUNTIME)@Constraint(validatedBy = CheckCaseValidator.class)@Documented@Repeatable(List.class)public @interface CheckCase {    String message() default "{org.hibernate.validator.referenceguide.chapter06.CheckCase." +            "message}";    Class>[] groups() default { };    Class extends Payload>[] payload() default { };    CaseMode value();    @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })    @Retention(RUNTIME)    @Documented    @interface List {        CheckCase[] value();    }}

一个注解类型使用@Interface关键字来定义,所有的属性在一个注解类型中,像方法那样被声明。

这个Bean Validation API 需要的规范中,任何的约束注解都定义如下:

  • 一个属性message,它返回默认的key,用来创建error message,当约束被违反的时候;
  • 一个属性groups,允许校验组的规范,这个约束属于这个组。它必须默认是一个Class>的空数组;
  • 一个属性叫做payload,它使用在Bean Valdation API的客户端上,来安排自定义的payload对象在一个约束上。这个属性不会被API自身使用,比如:一个自定义的payload可以是一个Severity的定义:
public class Severity {    public interface Info extends Payload {    }    public interface Error extends Payload {    }}
public class ContactDetails {    @NotNull(message = "Name is mandatory", payload = Severity.Error.class)    private String name;    @NotNull(message = "Phone number not specified, but not mandatory",            payload = Severity.Info.class)    private String phoneNumber;    // ...}

除了这三个强制属性外,还有另一个属性value。它允许指定所需要的case的模式。name值是一个特殊的值,如果它是唯一指定的属性,那么在使用注解时,可以省略它,例如在@CheckCase(CaseMode.UPPER)。

另外,约束注释由几个元注释修饰:

  • @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE}):定义支持的目标元素类型。@CheckCase可以用在成员变量(FIELD)上,JavaBean的属性上,同时也可以用在方法的返回值上,方法/构造器的参数(PARAMETER)上,和类型参数(TYPE_USE)上。元素类型ANNOTATION_TYPE允许创建组合注解,基于@CheckCase。
    • 当创建一个类级别的约束的时候,这个元素类型TYPE将会被使用。约束的目标是是构造器的返回值的,需要支持CONSTRUCTOR类型。
    • 交叉参数注解可以别用来校验方法或构造器的参数,但是必须支持METHOD或者CONSTRUNTOR。
  • @Retention(RUNTIME):指定注解的类型,将用在运行时,通过反射。
  • @Constraint(validatedBy = CheckCaseValidator.class):标记注解的类型是约束注解,和指定将被使用的校验器,来校验加上@CheckCase的元素。如果一个约束可以用在几种类型上,几种校验器可以被指定,每一种数据类型。
  • @Documented:@CheckCase的使用,可以包含在javaDoc文档中。
  • @Repeatable(List.class):指示可以在同一位置多次注释,通常用不同的配置,List是包含注解的类型。

这个包含注解类型的List也在例子中展示。它允许指定几个@CheckCase注解在相同的元素上,用不同的教校验组和messages。

二是另一个名字也可以被使用,这个Bean Validation 规范推荐使用List和使这个注解,作为一个相应类型注解的内部注解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值