Lombok对象中实现“至少一个字段存在”的校验

Lombok对象中实现“至少一个字段存在”的校验

本文详细介绍了如何在lombok生成的java对象中,利用jsr 303规范的`@assertfalse`注解,实现一个关键的业务校验:确保两个或多个可空字段中,至少有一个必须存在值。通过一个具体的`example`类示例,演示了如何定义一个私有方法来检查无效状态(即所有字段都为null),并结合`@assertfalse`强制其结果为`false`,从而在运行时进行有效性验证。

在现代Java应用开发中,数据模型(DTOs、实体类等)的校验是确保数据完整性和业务逻辑正确性的重要环节。Lombok极大地简化了样板代码的编写,但某些复杂的业务校验逻辑仍需手动实现。其中一个常见需求是,在一个对象中,有多个字段可能为空,但至少其中一个字段必须包含值。例如,一个联系方式对象可能包含手机号和邮箱,但用户必须提供其中至少一个。

业务场景:至少一个字段存在

假设我们有一个使用Lombok构建的Java对象Example,它包含两个String类型的字段maybeA和maybeB,这两个字段都是可空的。我们的业务规则要求,当构建Example对象时,maybeA和maybeB不能同时为空。换句话说,允许maybeA有值且maybeB为空,允许maybeA为空且maybeB有值,也允许maybeA和maybeB都有值,但绝不允许maybeA和maybeB都为空。

初始的Lombok对象定义可能如下:

import lombok.Builder;import lombok.Getter;import lombok.RequiredArgsConstructor;@Getter@Builder@RequiredArgsConstructorclass Example {    private final String maybeA;    private final String maybeB;}

直接使用Lombok的注解无法表达这种“互斥非空”或“至少一个存在”的复杂校验逻辑。此时,我们需要借助Java Bean Validation(JSR 303/380)规范提供的注解。

解决方案:使用@AssertFalse实现互斥非空校验

Java Bean Validation规范提供了多种约束注解,其中@AssertFalse非常适合解决此类问题。@AssertFalse注解可以应用于一个返回boolean类型的方法上,它要求该方法的返回结果必须为false,否则验证失败。

利用这个特性,我们可以定义一个私有方法来检查“无效”的状态。对于“maybeA和maybeB不能同时为空”这个规则,其无效状态就是“maybeA为空且maybeB为空”。如果这个无效状态为真,那么我们的验证就应该失败。因此,我们将@AssertFalse应用于一个当maybeA和maybeB都为空时返回true的方法。

下面是修改后的Example类:

Word-As-Image for Semantic Typography Word-As-Image for Semantic Typography

文字变形艺术字、文字变形象形字

Word-As-Image for Semantic Typography 62 查看详情 Word-As-Image for Semantic Typography

import lombok.Builder;import lombok.Getter;import lombok.RequiredArgsConstructor;import javax.validation.constraints.AssertFalse; // 引入javax.validation包@Getter@Builder@RequiredArgsConstructorclass Example {    private final String maybeA;    private final String maybeB;    /**     * 验证方法:确保maybeA和maybeB不能同时为空。     * 当maybeA和maybeB都为null时,此方法返回true,     * 结合@AssertFalse注解,将导致验证失败。     */    @AssertFalse(message = "maybeA和maybeB不能同时为空,至少需要提供一个值。")    private boolean oneFieldHasToExists() {        return maybeA == null && maybeB == null;    }}

代码解析:

@AssertFalse注解: 它来自javax.validation.constraints包,是JSR 303/380 Bean Validation规范的一部分。oneFieldHasToExists()方法: 这是一个私有方法,其命名应清晰地表达其验证目的。该方法返回maybeA == null && maybeB == null的结果。如果maybeA和maybeB都为null,则表达式为true。如果maybeA或maybeB(或两者)不为null,则表达式为false。验证逻辑: @AssertFalse要求其所注解的方法必须返回false才能通过验证。因此,当maybeA和maybeB都为null时,oneFieldHasToExists()返回true,@AssertFalse就会触发验证失败,从而实现了“至少一个字段存在”的约束。message属性: 可以通过message属性自定义验证失败时的提示信息,这对于用户体验和错误排查非常重要。

使用与注意事项

要使上述校验生效,你的项目需要引入Bean Validation API及其实现,例如Hibernate Validator。

Maven 依赖示例:

    javax.validation    validation-api    2.0.1.Final     org.hibernate.validator    hibernate-validator    6.0.16.Final 

在Spring Boot等框架中,通常只需在控制器方法参数上使用@Valid注解,即可自动触发Bean Validation:

import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid; // 引入javax.validation包@RestControllerpublic class ExampleController {    @PostMapping("/examples")    public String createExample(@Valid @RequestBody Example example) {        // 如果example对象验证失败,将抛出MethodArgumentNotValidException        // 否则,处理example对象        return "Example created successfully!";    }}

注意事项:

方法可见性: 验证方法可以是private,protected或public,但通常建议使用private,因为它只是内部验证逻辑的一部分。方法签名: 验证方法必须返回boolean类型,且不能有任何参数。错误信息: 务必通过message属性提供清晰的错误信息,以便前端或客户端能够准确地理解验证失败的原因。复杂逻辑: 对于更复杂的跨字段校验逻辑,可以考虑使用自定义的组合注解,但这超出了本教程的范围。Lombok与Validation: Lombok生成的构造器和Getter/Setter与Bean Validation注解是完全兼容的。

总结

通过巧妙地结合Lombok和JSR 303 Bean Validation规范中的@AssertFalse注解,我们可以优雅地在Java对象中实现“至少一个字段必须存在”的复杂校验逻辑。这种方法保持了代码的整洁性,并将校验逻辑内聚在数据模型本身,有助于提高代码的可维护性和健壮性。在实际开发中,理解并灵活运用各种验证注解,能够帮助我们构建更加可靠的应用程序。

以上就是Lombok对象中实现“至少一个字段存在”的校验的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/993641.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
格式工厂使用指南:轻松转换文件格式
上一篇 2025年12月1日 21:51:49
真我GT7 Pro产品力拉满:超声波指纹、超大电池、百瓦快充均在列
下一篇 2025年12月1日 21:51:54

相关推荐

  • OPPO K11系统动画太慢怎么关闭 OPPO K11性能流畅设置

    开启开发者选项并调整动画速度可提升OPPO K11操作流畅度:进入设置→关于手机→连续点击版本号7次,返回后进入开发者选项,将窗口动画缩放、过渡动画缩放和动画程序时长缩放均改为0.5x或关闭,系统响应更迅速。 OPPO K11系统动画太慢,想让手机操作更跟手,可以关闭或调快系统动画。这个设置不在常规…

    2026年9月20日
    200
  • 淘宝88vip会员可以给别人使用吗?该如何办理呢?淘宝88VIP怎么共享吗?1分钟学会主副卡绑定,全家都能用!

    一、淘宝88VIP会员可以和家人朋友共用吗? 可以!淘宝88VIP支持主副账号共享机制,主账号最多可绑定5个亲友账号,让他们一同享用部分会员福利。但需要注意的是,像95折购物优惠、专属客服等核心权益仅限主账号本人使用。本文将详细介绍如何开通88VIP、如何添加家庭成员、哪些权益能共享,并提醒你关注账…

    2026年9月20日
    000
  • 腾讯元宝AI便捷体验入口 腾讯元宝网页版在线入口

    腾讯元宝AI便捷体验入口为https://yuanbao.tencent.com,支持网页版、手机APP及微信小程序访问,提供智能问答、文档解析、内容生成等多功能服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 腾讯元宝AI便捷体验入口…

    2026年9月20日
    000
  • Android Activity与Fragment通信及视图访问的最佳实践

    本文旨在解决android开发中activity与fragment之间视图访问和数据通信的常见问题,特别是当使用bottom navigation activity模板时。我们将探讨为何不能直接在activity中访问fragment视图,并详细介绍如何利用fragment的生命周期方法(如`onv…

    2026年9月20日
    100
  • Redmi K70电池续航表现解析 Redmi K70充电优化技巧

    Redmi K70续航表现因使用习惯而异,重度使用亮屏5.5至6.5小时,日常通勤可撑一天;120W快充19分钟充满,建议随用随充、开启智能充电保护,并避免边充边玩大型游戏;通过开启自动亮度、降低分辨率至1.5K、限制后台高耗电应用可有效延长续航。 Redmi K70的续航到底怎么样,充电怎么用才最…

    2026年9月20日
    100
  • Gemini2.5网页版访问入口_Gemini2.5官方网站下载链接

    Gemini 2.5网页版访问入口为 https://gemini.google.com/app,登录谷歌账号后可使用主交互界面、模型切换、文件上传、历史记录及移动端同步等功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Gemini2…

    2026年9月20日
    000
  • Java Swing:在类中管理 JFrame 实例的两种策略

    本文探讨在 java swing 应用程序中,如何有效地在不同方法中访问和管理 jframe 实例,避免 this 关键字的限制。我们将介绍两种核心策略:将 jframe 作为类成员变量,或使类直接继承 jframe。同时,强调组件应添加到 jframe 的内容面板,而非直接添加到 jframe。 …

    2026年9月20日
    000
  • VSCode的扩展推荐是怎么工作的?

    VSCode的扩展推荐基于用户行为和项目环境智能生成,当你打开.py文件时会推荐Python相关工具,打开.ts、.vue等文件则触发对应语言插件;系统通过分析package.json、requirements.txt等依赖文件识别技术栈,推荐Docker、ESLint等匹配扩展;同时记录常用操作如…

    2026年9月20日
    000
  • Linux怎么查看进程使用的端口号

    答案是使用netstat、ss或lsof命令可查看Linux进程占用的端口。首先推荐ss命令,如ss -tulnp | grep 8080,能快速显示监听端口及对应进程;其次netstat -tulnp | grep 8080用法类似,但速度较慢;lsof -i :8080可精确查看指定端口的进程信…

    2026年9月20日
    000
  • 内存占用过高的优化方法

    优化内存占用的方法包括:1. 遵循基本内存管理原则,避免不必要的对象创建,使用合适的数据结构,及时释放资源;2. 优化数据结构,如从arraylist切换到hashmap;3. 检测并修复内存泄漏,通过定期清理不再需要的数据;4. 使用对象池减少对象的创建和销毁;5. 遵循性能优化与最佳实践,避免频…

    2026年9月20日
    000
  • iPhone命名或跳过19

    iPhone命名或跳过19 近日,科技圈内流传着一个引人瞩目的猜测:苹果公司在为其未来产品命名时,可能会选择直接跳过“iphone 19”这个名称。这一传闻并非空穴来风,而是基于苹果公司以往的命名策略、行业发展趋势以及对品牌形象的整体考量。如果成真,这将是iphone命名史上一个值得记录的时刻。 历…

    2026年9月20日
    100
  • 安全优雅地关闭Tomcat Embedded (无Spring环境)

    本文旨在提供一种在没有Spring框架的情况下,安全优雅地关闭Tomcat Embedded服务器的方法。通过手动管理Servlet生命周期和Tomcat实例,确保资源得到正确释放,避免数据丢失或连接中断,保证服务器的平稳关闭。 在嵌入式Tomcat应用中,优雅地关闭服务器至关重要,尤其是在生产环境…

    2026年9月20日
    000
  • 2025汽车品牌口碑指数NPS公布:小米、问界仅44分

    2025汽车品牌口碑指数NPS公布:小米、问界仅44分2025汽车品牌口碑指数NPS公布:小米、问界仅44分2025汽车品牌口碑指数NPS公布:小米、问界仅44分2025汽车品牌口碑指数NPS公布:小米、问界仅44分

    10月17日,有调研机构发布了2025中国汽车品牌口碑指数nps。其中,小米汽车与aito问界品牌的nps(净推荐值)均仅为44分,远低于行业头部品牌。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 小米汽车 报告显示,新能源汽车主流品牌的…

    2026年9月20日 用户投稿
    000
  • 当VSCode启动或运行变慢时,有哪些系统性的排查和优化步骤?

    答案:VSCode变慢主要由扩展、文件监控和设置引起。先以安全模式启动排查扩展影响,使用内置性能工具分析启动耗时,优化工作区的文件监听与搜索范围,调整渲染设置并清理缓存,可显著提升运行效率。 VSCode 启动或运行变慢通常涉及扩展、设置、系统资源或文件索引等问题。以下是系统性的排查与优化步骤,帮助…

    2026年9月20日
    000
  • 拼多多砍价咨询处理难题?晓多方言识别技术提升30%订单转化!方言咨询不再“听不懂”!「别担心」有晓多来帮你

    在拼多多的砍价活动中,每天有超500万条来自全国各地的方言咨询涌入商家后台。“这个价咋个砍嘛?”“阿妹帮我看下这价啷个算?”面对五湖四海的方言提问,传统客服系统频频“崩溃”。晓多科技推出的方言识别技术矩阵,融合xpt大模型与先进声学算法,成功将订单转化率提升30%,为电商行业解决了长期存在的服务瓶颈…

    2026年9月20日
    000
  • Figure人形机器人全面升级 阿里/微美全息构筑竞争护城河抢占行业先机!

    Figure人形机器人全面升级  阿里/微美全息构筑竞争护城河抢占行业先机!Figure人形机器人全面升级  阿里/微美全息构筑竞争护城河抢占行业先机!Figure人形机器人全面升级  阿里/微美全息构筑竞争护城河抢占行业先机!Figure人形机器人全面升级  阿里/微美全息构筑竞争护城河抢占行业先机!

    获悉,日前,全球工业自动化领域迎来一场颠覆性变革。10月8日,abb集团正式宣布,将其机器人业务单元以53.75亿美元的企业价值出售给日本软银集团。 此次交易不仅彻底改变了工业机器人“四大家族”的竞争版图,也凸显出AI巨头向实体制造领域深度布局的战略野心。背后动因在于,当前工业机器人行业正处于关键转…

    2026年9月20日 用户投稿
    200
  • 如何创建一个基础的Swoole HTTP服务器?

    要创建一个基础的swoole http服务器,步骤如下:1. 使用swoole的httpserver类创建服务器实例;2. 设置服务器启动时的回调函数;3. 设置请求处理的回调函数;4. 启动服务器。这个过程通过示例代码展示了如何在9501端口监听请求并返回响应,swoole的异步特性和协程功能可以…

    2026年9月20日
    100
  • “满血版”东风日产N7到来!NISSAN OS 1.3.0正式推送

    “满血版”东风日产N7到来!NISSAN OS 1.3.0正式推送“满血版”东风日产N7到来!NISSAN OS 1.3.0正式推送“满血版”东风日产N7到来!NISSAN OS 1.3.0正式推送“满血版”东风日产N7到来!NISSAN OS 1.3.0正式推送

      近日,东风日产n7迎来上市之后第二次大版本系统升级,版本号为nissan os 1.3.0。此次升级新增城市记忆领航辅助驾驶与记忆泊车辅助两大核心功能,并对20余项座舱功能进行优化,标志着n7正式进阶为“满血版”。此次升级旨在为用户提供合资品牌中最领先的智能辅助驾驶体验,以及更便捷、更愉悦的座舱…

    2026年9月20日 用户投稿
    000
  • 如何设置VSCode的默认编码?

    VSCode默认使用UTF-8编码,可通过设置files.encoding指定默认编码如utf8、gbk;2. 启用files.autoGuessEncoding可自动识别文件编码;3. 在settings.json中配置可持久化编码设置,支持手动修改并即时生效。 VSCode 默认使用 UTF-8…

    2026年9月20日
    000
  • 荣耀Magic8系列发布会六大产品价格汇总来了:349元起 最贵6699元!

    10月15日,荣耀召开新品发布会,正式推出荣耀Magic8系列、荣耀MagicPad 3 Pro等六大新品,涵盖手机、平板、耳机、智能手表及智能配件。 各产品价格信息汇总如下: 荣耀Magic8系列 荣耀Magic8 12GB+256GB:4499元 12GB+512GB:4799元 16GB+51…

    2026年9月20日
    000

发表回复

登录后才能评论
关注微信