首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hibernate验证注释-验证至少有一个字段不为空

基础概念

Hibernate Validator 是一个用于 Java 的 Bean Validation 实现,它基于 JSR 380(Java Specification Requests 380)标准。通过使用注解,可以在 Java 对象的字段上定义验证规则,从而在数据持久化之前进行验证。

相关优势

  1. 简化验证逻辑:通过注解的方式,可以将验证逻辑直接写在实体类中,减少了额外的验证代码。
  2. 提高代码可读性:注解的方式使得验证规则一目了然,便于维护。
  3. 支持多种验证方式:Hibernate Validator 支持多种内置的验证注解,如 @NotNull, @Size, @Pattern 等,同时也支持自定义验证注解。

类型

Hibernate Validator 提供了多种内置的验证注解,常见的包括:

  • @NotNull:确保字段不为空。
  • @NotEmpty:确保集合、数组或字符串不为空。
  • @Min@Max:确保数值在指定范围内。
  • @Pattern:确保字段符合正则表达式。

应用场景

Hibernate Validator 广泛应用于各种需要数据验证的场景,如:

  • 表单验证
  • 数据库实体验证
  • API 请求参数验证

遇到的问题及解决方法

问题:验证至少有一个字段不为空

假设我们有一个 User 实体类,其中包含 firstNamelastName 字段,我们希望至少有一个字段不为空。

原因

直接使用 @NotNull@NotEmpty 注解无法实现至少有一个字段不为空的验证。

解决方法

我们可以使用自定义验证注解和验证器来实现这一需求。

  1. 定义自定义注解
代码语言:txt
复制
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = AtLeastOneFieldNotNullValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AtLeastOneFieldNotNull {
    String message() default "At least one field must not be null";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
  1. 实现自定义验证器
代码语言:txt
复制
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class AtLeastOneFieldNotNullValidator implements ConstraintValidator<AtLeastOneFieldNotNull, Object> {

    @Override
    public void initialize(AtLeastOneFieldNotNull constraintAnnotation) {
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) {
            return true; // 如果整个对象为空,通常由其他验证器处理
        }

        try {
            String firstName = (String) value.getClass().getMethod("getFirstName").invoke(value);
            String lastName = (String) value.getClass().getMethod("getLastName").invoke(value);

            return (firstName != null && !firstName.isEmpty()) || (lastName != null && !lastName.isEmpty());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
  1. 在实体类中使用自定义注解
代码语言:txt
复制
import javax.validation.constraints.NotNull;

@AtLeastOneFieldNotNull
public class User {

    @NotNull
    private String firstName;

    @NotNull
    private String lastName;

    // Getters and setters
}

示例代码

代码语言:txt
复制
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;

public class Main {
    public static void main(String[] args) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        User user = new User();
        user.setFirstName(null);
        user.setLastName(null);

        Set<ConstraintViolation<User>> violations = validator.validate(user);

        for (ConstraintViolation<User> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }
}

参考链接

通过上述方法,我们可以实现至少有一个字段不为空的验证需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • springboot自动判定

    方案 按照我们以往的做法,都是对request中的参数一个一个进行非判定。...){ return "comment不能为"; } return "sucess"; } 这种做法首先是可取的,能达到我们的要求,但是这样如果model字段过多,判定的就很...return results.getFieldError().getDefaultMessage(); } return "success"; } 这样我们就只需要在model字段上加上非验证和相应提示语就好了...(max,min) 限制字符长度必须在min到max之间 @Past 验证注解的元素值(日期类型)比当前时间早 @NotEmpty 验证注解的元素值不为null且不为(字符串长度不为0、集合大小不为...0) @NotBlank 验证注解的元素值不为(不为null、去除首位空格后长度为0),不同于@NotEmpty, @NotBlank只应用于字符串且在比较时会去除字符串的空格 @Email 验证注解的元素值是

    3.9K10

    如何实现Java后端数据校验?看这篇就足够!

    AssertTrue 用于boolean字段,该字段只能为true DecimalMax(value) 被注释的元素必须是一个数字,只能大于或等于该值 DecimalMin(value) 被注释的元素必须是一个数字...只能用于字符串不为null,并且字符串trim()以后length要大于0 NotEmpty 集合对象的元素不为0,即集合不为,也可以用于字符串不为null Range(min=, max=) 被注释的元素必须在合适的范围内...快速失败返回模式 快速失败返回模式(只要有一个验证失败,则返回) 两种验证模式配置方式:参考 hibernate 官方文档 failFast:true 快速失败返回模式...顾名思义,嵌套验证就是一个实体中的属性包含其他实体,在对当前实体做校验的同时,还要对其属性的实体进行嵌套验证,比如,我们现在有一个实体CreateRoomInfoVO,通过Java+Hibernate校验...能够用在成员属性(字段)上,提示验证框架进行嵌套验证。需要在黛娇妍对象注解@Valid进行嵌套验证

    13.4K72

    springboot使用hibernate validator校验

    一、参数校验  在开发中经常需要写一些字段校验的代码,比如字段字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参数验证是否完整...,字段上注解+验证不通过提示信息即可代替手写一大堆的非字段限制验证代码。...,通常按顺序验证到第一个字段不符合验证要求时,就可以直接拒绝请求了。...null      @NotNull    被注释的元素必须不为 null      @AssertTrue     被注释的元素必须为 true      @AssertFalse    被注释的元素必须为...      @Past   被注释的元素必须是一个过去的日期      @Future     被注释的元素必须是一个将来的日期      @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式

    5.7K50

    Springboot-Validate-全局Exception记录

    Bean Validation 中内置的 验证规则: 注解 作用 @Valid 被注释的元素是一个对象,需要检查此对象的所有字段值 @Null 被注释的元素必须为 null @NotNull...被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字...) 被注释的元素必须符合指定的正则表达式 Hibernate Validator 验证规则: 注解 作用 @Email 被注释的元素必须是电子邮箱地址 @Length(min=, max=) 被注释的字符串的大小必须在指定的范围内...0,即集合不为,也可以用于字符串不为null @NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0 此处使用spring内置的Validate: pom:...能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证

    66110

    如何在你的项目中使用JSR 303 - Bean Validation进行数值校验?

    此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。...是对上述接口的实现; log4j、slf4j、slf4j-log4j 三、JSR 303 基本的校验规则 检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null,...日期检查 @Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期 @Future 验证 Date 和 Calendar 对象是否在当前时间之后...,验证成立的话被注释的元素一定是一个将来的日期 @Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag...String orderId; // 必须不为 @NotEmpty private String customer; // 必须是一个电子信箱地址 @Email

    1.4K40

    商城项目-注册功能

    在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。...6.5.2.Bean校验的注解 常用注解如下: Constraint 详细信息 @Valid 被注释的元素是一个对象,需要检查此对象的所有字段值 @Null 被注释的元素必须为 null @NotNull...被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值...@Email 被注释的元素必须是电子邮箱地址 @Length 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非 @Range 被注释的元素必须在合适的范围内 @NotBlank...被注释的字符串的必须非 @URL(protocol=,host=, port=,regexp=, flags=) 被注释的字符串必须是一个有效的url @CreditCardNumber 被注释的字符串必须通过

    88710

    SpringBoot入门建站全系列(三十三)集成validator校验接口数据

    SpringBoot入门建站全系列(三十三)集成validator校验接口数据 一、概述 在开发中经常需要写一些字段校验的代码,比如字段字段长度限制,邮箱格式验证等等,如果我们直接将这些校验写死在代码里...,将会遇到这种现象: 验证代码繁琐,重复劳动 方法内代码显得冗长 代码可读性不高 所以,我们可以使用hibernate validator来对字段的校验工作统一完成。...Map和数组 @Valid 验证关联的对象,如账户对象里有一个订单对象,指定验证订单对象 Any non-primitive type(引用类型) @NotEmpty 验证注解的元素值不为null且不为...如,一个对象A持有另一个对象B的引用,对象B中某些字段不想在对象A校验的时候被校验到,可以使用分组校验。..., "用户名不能为" ] 七、自定义注解校验 有时候,我们仍需要自定义校验注解,如,我这里定义一个只校验0或1数据的验证器。

    1.1K10

    求求你别在用IF ELSE校验参数了

    3.注解介绍 JSR 380内置常用注解 注解 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true...,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期 @Pattern(value) 被注释的元素必须符合指定的正则表达式 @Email...标准校验注释的字符串必须是一个的有效的url @Range 被注释的元素必须在合适的范围内,应用于数值或字符串 @UniqueElements 检查带注释的集合是否只包含唯一的元素。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...Validator有两种校验模式: 普通模式(会校验完所有的属性,然后返回所有的验证失败信息,默认是这个模式) 快速失败返回模式(只要有一个字段验证失败,就返回结果) 在@Configuration

    1.9K10

    求求你别在用IF ELSE校验参数了

    3.注解介绍 JSR 380内置常用注解 注解 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true...,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期 @Pattern(value) 被注释的元素必须符合指定的正则表达式 @Email...标准校验注释的字符串必须是一个的有效的url @Range 被注释的元素必须在合适的范围内,应用于数值或字符串 @UniqueElements 检查带注释的集合是否只包含唯一的元素。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...Validator有两种校验模式: 普通模式(会校验完所有的属性,然后返回所有的验证失败信息,默认是这个模式) 快速失败返回模式(只要有一个字段验证失败,就返回结果) 在@Configuration

    1.8K20

    Validator,就来这一篇吧

    3.注解介绍 JSR 380内置常用注解 注解 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true...,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期 @Pattern(value) 被注释的元素必须符合指定的正则表达式 @Email...标准校验注释的字符串必须是一个的有效的url @Range 被注释的元素必须在合适的范围内,应用于数值或字符串 @UniqueElements 检查带注释的集合是否只包含唯一的元素。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...Validator有两种校验模式: 普通模式(会校验完所有的属性,然后返回所有的验证失败信息,默认是这个模式) 快速失败返回模式(只要有一个字段验证失败,就返回结果) 在@Configuration

    2.7K10

    求求你别在用IF ELSE校验参数了

    3.注解介绍 JSR 380内置常用注解 注解 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true...,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期 @Pattern(value) 被注释的元素必须符合指定的正则表达式 @Email...标准校验注释的字符串必须是一个的有效的url @Range 被注释的元素必须在合适的范围内,应用于数值或字符串 @UniqueElements 检查带注释的集合是否只包含唯一的元素。...@Valid:作为标准JSR-303规范,还没有吸收分组的功能; @Valid:可以用在方法、方法参数、构造函数、方法参数和成员属性(字段)上; @Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上...Validator有两种校验模式: 普通模式(会校验完所有的属性,然后返回所有的验证失败信息,默认是这个模式) 快速失败返回模式(只要有一个字段验证失败,就返回结果) 在@Configuration

    1.7K20

    Bean Validation 介绍及最佳实践关于 Bean ValidationBean Validation 中的 constraint创建一个包含验证逻辑的简单应用(基于 JSP)定制化的 co

    Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。 Hibernate Validator 是 Bean Validation 的参考实现 ....Hibernate Validator 附加的 constraint Constraint 详细信息 @Email 被注释的元素必须是电子邮箱地址 @Length 被注释的字符串的大小必须在指定的范围内...@NotEmpty 被注释的字符串的必须非 @Range 被注释的元素必须在合适的范围内 一个 constraint 通常由 annotation 和相应的 constraint validator...String orderId; // 必须不为 @NotEmpty private String customer; // 必须是一个电子信箱地址 @Email private...String email; // 必须不为 @NotEmpty private String address; // 必须不为 null, 必须是下面四个字符串'created', 'paid

    1.1K70

    hibernate validator】(二)声明和验证Bean约束

    字段级别约束 不支持静态类型字段 验证引擎直接访问实例变量,不会调用属性的访问器 在验证字节码增强的对象时,应适用属性级别约束,因为字节码增库无法通过反射确定字段访问...不要字段和getter都加校验,这样会导致校验两次 package org.hibernate.validator.referenceguide.chapter02....约束继承 在一个类实现接口或扩展另一个类时,在超类上声明的所有约束注释都以与该类本身上指定的约束相同的方式约束 package org.hibernate.validator.referenceguide.chapter02...null并且长度大于0 CharSequence @NotEmpty 指定字符不为null或为(去除尾随空格) CharSequence...,Collection,Map和数组 @NotNull 检查注释的值不为null 所有类型均支持 @Negative 检查元素是否严格为负

    25340

    一坨一坨的 ifelse 参数校验,终于被 SpringBoot 参数校验组件整干净了!

    案例一:校验特定字段的值是否在可选范围 比如我们现在多了这样一个需求:PersonRequest 类多了一个 Region 字段,Region 字段只能是China、China-Taiwan、China-HongKong...JSR 提供的校验注解: @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为...被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future...被注释的元素必须是一个将来的日期 @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式 Hibernate Validator 提供的校验注解: @NotBlank(message...=) 验证字符串非 null,且长度必须大于 0 @Email 被注释的元素必须是电子邮箱地址 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非

    1.6K60

    Spring Validation

    注解 JSR 提供的校验注解: 注解 说明 @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse...被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin...被注释的元素必须是一个将来的日期 @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式 Hibernate Validator 提供的校验注解: 注解 说明 @NotBlank...() 验证字符串非 null,且长度必须大于 0 @Email 被注释的元素必须是电子邮箱地址 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非...需求:Person 类有一个 region 字段,region 字段只能是 China、China-Taiwan、China-HongKong 这三个中的一个

    43820

    一起来学SpringBoot | 第十九篇:轻松搞定数据验证(一)

    WEB工程 对于任何一个应用而言,客户端做的数据有效性验证都不是安全有效的, 而数据验证又是一个企业级项目架构上最为基础的功能模块,这时候就要求我们在服务端接收到数据的时候也对数据的有效性进行验证。...没有的注解,有兴趣的可以看看 限制必须不为null 实体类 为了体现 validation 的强大,分别演示普通参数属性验证与对象的验证 package com.battcn.pojo; import...(添加在方法上无效) @NotBlank: 被注释的字符串不允许为( value.trim()>0?...true:false) @Length: 被注释的字符串的大小必须在指定的范围内 @NotNull: 被注释字段不允许为( value!=null?...true:false) @DecimalMin: 被注释字段必须大于或等于指定的数值 package com.battcn.controller; import com.battcn.pojo.Book

    83330

    SpringMVC参数校验

    } 这里看还挺整齐的,一目了然,其实除了非判断还需各种格式验证没有列出了,如果再添加参数就成了累赘,一个类中参数校验的代码就占了大部分,得不偿失 这时候就该考虑简便的参数校验方式了——JSR-303(...JSR-303 JSR-303是一个被提出来的数据验证规范,所以这仅仅是个接口,没有具体实现的功能,容易被误解为JSR-303就是用于数据验证的的工具。...我们可以将其分成两部分,一个是JSR-303规范中包含的,另一部分是hibernate额外提供的。...下面的注解看解释就能明白是什么功能了 JSR-303规范 Annotation Description @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue...@Future 被注释的元素必须是一个将来的日期 @Pattern(value) 被注释的元素必须符合指定的正则表达式 hibernate额外提供的 Constraint 详细信息 @Email 被注释的元素必须是电子邮箱地址

    1.1K10
    领券