百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-30 09:48 14 浏览 0 评论

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和使这个注解,作为一个相应类型注解的内部注解。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码