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

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

xsobi 2024-11-24 00:29 1 浏览

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

相关推荐

好用的云函数!后端低代码接口开发,零基础编写API接口

前言在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作。不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人,通过...

快速上手:Windows 平台上 cURL 命令的使用方法

在工作流程中,为了快速验证API接口有效性,团队成员经常转向直接执行cURL命令的方法。这种做法不仅节省时间,而且促进了团队效率的提升。对于使用Windows系统的用户来说,这里有一套详细...

使用 Golang net/http 包:基础入门与实战

简介Go的net/http包是构建HTTP服务的核心库,功能强大且易于使用。它提供了基本的HTTP客户端和服务端支持,可以快速构建RESTAPI、Web应用等服务。本文将介绍ne...

#小白接口# 使用云函数,人人都能编写和发布自己的API接口

你只需编写简单的云函数,就可以实现自己的业务逻辑,发布后就可以生成自己的接口给客户端调用。果创云支持对云函数进行在线接口编程,进入开放平台我的接口-在线接口编程,设计一个新接口,设计和配置好接口参...

极度精神分裂:我家没有墙面开关,但我虚拟出来了一系列开关

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:iN在之前和大家说过,在iN的家里是没有墙面开关的。...

window使用curl命令的注意事项 curl命令用法

cmd-使用curl命令的注意点前言最近在cmd中使用curl命令来测试restapi,发现有不少问题,这里记录一下。在cmd中使用curl命令的注意事项json不能由单引号包括起来json...

Linux 系统curl命令使用详解 linuxctrl

curl是一个强大的命令行工具,用于在Linux系统中进行数据传输。它支持多种协议,包括HTTP、HTTPS、FTP等,用于下载或上传数据,执行Web请求等。curl命令的常见用法和解...

Tornado 入门:初学者指南 tornados

Tornado是一个功能强大的PythonWeb框架和异步网络库。它最初是为了处理实时Web服务中的数千个同时连接而开发的。它独特的Web服务器和框架功能组合使其成为开发高性能Web...

PHP Curl的简单使用 php curl formdata

本文写给刚入PHP坑不久的新手们,作为工具文档,方便用时查阅。CURL是一个非常强大的开源库,它支持很多种协议,例如,HTTP、HTTPS、FTP、TELENT等。日常开发中,我们经常会需要用到cur...

Rust 服务器、服务和应用程序:7 Rust 中的服务器端 Web 应用简介

本章涵盖使用Actix提供静态网页...

我给 Apache 顶级项目提了个 Bug apache顶级项目有哪些

这篇文章记录了给Apache顶级项目-分库分表中间件ShardingSphere提交Bug的历程。说实话,这是一次比较曲折的Bug跟踪之旅。10月28日,我们在GitHub上提...

linux文件下载、服务器交互(curl)

基础环境curl命令描述...

curl简单使用 curl sh

1.curl--help#查看关键字2.curl-A“(添加user-agent<name>SendUser-Agent<name>toserver)”...

常用linux命令:curl 常用linux命令大全

//获取网页内容//不加任何选项使用curl时,默认会发送GET请求来获取内容到标准输出$curlhttp://www.baidu.com//输出<!DOCTYPEh...

三十七,Web渗透提高班之hack the box在线靶场注册及入门知识

一.注册hacktheboxHackTheBox是一个在线平台,允许测试您的渗透技能和代码,并与其他类似兴趣的成员交流想法和方法。它包含一些不断更新的挑战,并且模拟真实场景,其风格更倾向于CT...