如何在Lombok对象中强制要求两个可空字段至少一个存在

如何在Lombok对象中强制要求两个可空字段至少一个存在

本文探讨了在lombok生成的java对象中,如何为两个可空字段(例如`maybea`和`maybeb`)设置一个约束,即它们不能同时为null,至少其中一个必须存在。通过结合使用`javax.validation.constraints.assertfalse`注解和一个自定义的验证方法,我们能够有效地实现这一“异或”逻辑,确保数据模型的完整性和业务规则的遵循,而无需放弃lombok的便捷性。

1. 问题背景与需求

在使用Lombok的@Builder和@RequiredArgsConstructor等注解构建数据对象时,我们经常会遇到这样的场景:对象中包含多个字段,它们各自都可以是null。然而,在某些业务逻辑中,我们需要强制要求这些可空字段中的至少一个必须有值,即它们不能全部为null。例如,一个Example对象有两个字符串字段maybeA和maybeB,我们希望允许以下情况:

maybeA有值,maybeB有值maybeA有值,maybeB为nullmaybeA为null,maybeB有值

但不允许以下情况:

maybeA为null,maybeB为null

Lombok本身提供的注解(如@NonNull)只能强制单个字段非空,无法直接表达这种“异或”或“至少一个”的复杂约束。

2. 解决方案:结合JSR 380 (Bean Validation)

解决此类问题的标准方法是利用Java Bean Validation API (JSR 380),特别是其提供的自定义验证能力。javax.validation.constraints包中的注解,如@AssertFalse,可以用于标记一个方法,该方法返回true时表示验证失败。

2.1 引入依赖

首先,确保你的项目中已引入Bean Validation API及其实现(如Hibernate Validator)。在Maven项目中,通常需要添加以下依赖:

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

2.2 实现自定义验证逻辑

在Lombok生成的对象中,我们可以添加一个私有方法,该方法封装了“两个字段都为null”的判断逻辑,并使用@AssertFalse注解。

示例代码:

存了个图 存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

存了个图 17 查看详情 存了个图

import lombok.Builder;import lombok.Getter;import lombok.RequiredArgsConstructor;import javax.validation.constraints.AssertFalse; // 确保导入正确的包@Getter@Builder@RequiredArgsConstructorpublic class Example {    private final String maybeA;    private final String maybeB;    /**     * 验证方法:确保 maybeA 和 maybeB 不能同时为 null。     * @AssertFalse 表示当此方法返回 true 时,验证失败。     * 因此,当 maybeA 和 maybeB 都为 null 时,我们希望返回 true。     */    @AssertFalse(message = "maybeA 和 maybeB 不能同时为 null,至少一个必须存在。")    private boolean oneFieldHasToExist() {        return maybeA == null && maybeB == null;    }    // 可以在这里添加 main 方法或测试用例来演示    public static void main(String[] args) {        // 示例:有效的对象        Example validExample1 = Example.builder().maybeA("Value A").build();        Example validExample2 = Example.builder().maybeB("Value B").build();        Example validExample3 = Example.builder().maybeA("Value A").maybeB("Value B").build();        // 示例:无效的对象 (两个都为 null)        Example invalidExample = Example.builder().build(); // maybeA 和 maybeB 都是 null        // 实际应用中,你需要一个 Validator 实例来执行验证        // 例如:        // ValidatorFactory factory = Validation.buildDefaultValidatorFactory();        // Validator validator = factory.getValidator();        // Set<ConstraintViolation> violations = validator.validate(invalidExample);        // violations.forEach(v -> System.out.println(v.getMessage()));    }}

解释:

@AssertFalse: 这个注解是关键。它告诉Bean Validation框架,如果它所注解的方法返回true,则表示验证失败。oneFieldHasToExist() 方法:这个方法被标记为@AssertFalse。它的逻辑是 return maybeA == null && maybeB == null;。这意味着,当maybeA和maybeB都为null时,该方法返回true。根据@AssertFalse的语义,此时验证失败,从而实现了“不能同时为null”的约束。message 属性: 可以在@AssertFalse注解中指定message属性,用于自定义验证失败时返回的错误信息,这对于用户体验和调试非常重要。

3. 如何在应用中使用

在Spring Boot等Web框架中,通常会在Controller层接收请求体时使用@Valid注解来触发Bean Validation。

import org.springframework.http.ResponseEntity;import org.springframework.validation.annotation.Validated;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; // 确保导入正确的包@RestController@Validated // 如果需要在方法参数上使用 @Valid,通常 Controller 需要被 @Validated 标记public class ExampleController {    @PostMapping("/examples")    public ResponseEntity createExample(@Valid @RequestBody Example example) {        // 如果 example 对象通过了所有验证,则执行业务逻辑        System.out.println("Received valid example: " + example.getMaybeA() + ", " + example.getMaybeB());        return ResponseEntity.ok("Example created successfully!");    }}

当客户端发送一个maybeA和maybeB都为null的Example对象时,@Valid注解会触发验证,oneFieldHasToExist()方法会返回true,导致验证失败,Spring框架会自动捕获MethodArgumentNotValidException并返回一个400 Bad Request错误以及相应的错误信息。

4. 注意事项与总结

注解位置: AssertFalse(或其他@AssertTrue等)通常注解在方法上,而不是字段上。这个方法可以是私有的,因为Bean Validation框架会通过反射调用它。逻辑反转: 使用@AssertFalse时,方法的返回true表示违反了约束(即验证失败),而不是满足约束。这一点需要特别注意,避免混淆。错误信息: 始终为验证注解提供清晰的message,以便在验证失败时提供有用的反馈。组合验证: 对于更复杂的跨字段验证逻辑,可以考虑创建自定义的组合注解。但这通常比直接使用@AssertFalse或@AssertTrue更复杂。Lombok与Validation: Lombok生成的代码(如构造函数、getter)与Bean Validation注解可以很好地协同工作,互不干扰。

通过上述方法,我们能够在保持Lombok的简洁性和开发效率的同时,有效地为复杂的数据模型添加自定义的跨字段验证规则,确保应用程序的数据完整性和业务逻辑的正确性。

以上就是如何在Lombok对象中强制要求两个可空字段至少一个存在的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
uc浏览器网页版入口官网 uc浏览器网页版在线打开
上一篇 2026年10月20日 02:29:05
网友发现乐道明星车主名字都带三点水 博主:高人指点?
下一篇 2026年10月10日 06:22:18

相关推荐

  • 数据标注为AI发展加工“优质原料”

    数据标注为AI发展加工“优质原料”数据标注为AI发展加工“优质原料”数据标注为AI发展加工“优质原料”数据标注为AI发展加工“优质原料”

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 人工智能的蓬勃发展对高质量训练数据提出了巨大需求,数据短缺已成为制约行业进步的瓶颈。为解决这一问题,国家相关部门联合发布了《关于促进数据标注产业高质量发展的实施意见》,目标是到2027年,显著提…

    2026年10月20日 • 用户投稿
    000
  • edge浏览器无法切换用户配置文件的解决方法_Edge浏览器切换用户配置文件问题解决方法

    edge浏览器无法切换用户配置文件的解决方法_Edge浏览器切换用户配置文件问题解决方法edge浏览器无法切换用户配置文件的解决方法_Edge浏览器切换用户配置文件问题解决方法edge浏览器无法切换用户配置文件的解决方法_Edge浏览器切换用户配置文件问题解决方法edge浏览器无法切换用户配置文件的解决方法_Edge浏览器切换用户配置文件问题解决方法

    1、重启Edge并结束残留进程,检查账户显示是否正常;2、清除User Data目录下的BrowserMetrics等缓存文件;3、通过命令行使用–profile-directory参数强制启动指定配置文件;4、重命名疑似损坏的配置文件夹以重建新配置;5、检查Edge更新或执行修复/重置…

    2026年10月20日 • 用户投稿
    200
  • 广汽丰田上线“一口价”,最高降4.4万元

    广汽丰田上线“一口价”,最高降4.4万元广汽丰田上线“一口价”,最高降4.4万元广汽丰田上线“一口价”,最高降4.4万元广汽丰田上线“一口价”,最高降4.4万元

    笔灵降AI 论文降AI神器,适配知网及维普!一键降至安全线,100%保留原文格式;无口语化问题,文风更学术,降后字数控制最佳! 62 查看详情 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 2月5日,广汽丰田宣布,旗下的锋兰达和威兰达两款车…

    2026年10月20日 • 用户投稿
    200
  • 配置VSCode使用SSH密钥连接远程Git仓库

    配置VSCode使用SSH密钥连接远程Git仓库配置VSCode使用SSH密钥连接远程Git仓库配置VSCode使用SSH密钥连接远程Git仓库配置VSCode使用SSH密钥连接远程Git仓库

    首先生成SSH密钥对并保存至默认路径,接着将公钥添加到Git服务器的SSH设置中,然后通过ssh -T命令测试连接,最后在VSCode中使用SSH地址克隆或修改远程仓库,实现无密码认证。 使用SSH密钥连接远程Git仓库可以避免重复输入用户名和密码,提升开发效率。VSCode结合SSH配置能让你在编…

    2026年10月20日 • 用户投稿
    400
  • JPA CriteriaDelete与in子查询:确保数据操作正确执行

    JPA CriteriaDelete与in子查询:确保数据操作正确执行JPA CriteriaDelete与in子查询:确保数据操作正确执行JPA CriteriaDelete与in子查询:确保数据操作正确执行JPA CriteriaDelete与in子查询:确保数据操作正确执行

    本文旨在解决jpa `criteriadelete`结合`in`表达式和子查询时,数据删除操作不生效的问题。核心原因在于执行dml操作(如删除)后,必须显式调用`javax.persistence.query`对象的`executeupdate()`方法,而非仅创建查询。文章将通过详细解析和示例代码…

    2026年10月20日 • 用户投稿
    000
  • 探探App怎么处理账号封禁_探探App账号封禁申诉流程及预防措施

    探探App怎么处理账号封禁_探探App账号封禁申诉流程及预防措施探探App怎么处理账号封禁_探探App账号封禁申诉流程及预防措施探探App怎么处理账号封禁_探探App账号封禁申诉流程及预防措施探探App怎么处理账号封禁_探探App账号封禁申诉流程及预防措施

    能否解封取决于原因和操作。首先确认封禁原因并收集证据,如使用记录、聊天截图、身份证明等;若为误判,通过探探App内申诉入口提交材料,完成验证后等待1-7个工作日处理;也可联系客服邮箱或官方社交媒体反馈。解封后需遵守平台规则,避免发布违规内容、频繁操作或使用第三方工具,绑定手机号邮箱并定期改密,确保账…

    2026年10月20日 • 用户投稿
    200
  • 《幻兽帕鲁》开发商新作《不寐之境:女巫与诅咒》宣布跳过ea阶段直接发售

    《幻兽帕鲁》开发商新作《不寐之境:女巫与诅咒》宣布跳过ea阶段直接发售《幻兽帕鲁》开发商新作《不寐之境:女巫与诅咒》宣布跳过ea阶段直接发售《幻兽帕鲁》开发商新作《不寐之境:女巫与诅咒》宣布跳过ea阶段直接发售《幻兽帕鲁》开发商新作《不寐之境:女巫与诅咒》宣布跳过ea阶段直接发售

    两年前,《幻兽帕鲁》提出了一个设想:“如果宝可梦加入了基地建设和多人在线会变成什么样?”如今,pocketpair 的新作《不寐之境:女巫与诅咒》(never grave: the witch and the curse)正将同样的思路应用于《空洞骑士》。 这款游戏最初于 2023 年公开,并计划在…

    2026年10月20日 • 用户投稿
    200
  • VSCode工作区设置最佳实践

    VSCode工作区设置最佳实践VSCode工作区设置最佳实践VSCode工作区设置最佳实践VSCode工作区设置最佳实践

    合理配置VSCode工作区设置可提升团队协作效率。1. 使用项目根目录下的.vscode/settings.json定义统一编辑环境,如tabSize、换行符及保存时格式化,避免提交个人偏好配置。2. 结合.editorconfig文件实现跨编辑器的编码风格统一,管理缩进、换行等基础规则,减少格式不…

    2026年10月20日 • 用户投稿
    200
  • 机构:2024年全球平板电脑出货1.476亿台,小米跃居第五

    机构:2024年全球平板电脑出货1.476亿台,小米跃居第五机构:2024年全球平板电脑出货1.476亿台,小米跃居第五机构:2024年全球平板电脑出货1.476亿台,小米跃居第五机构:2024年全球平板电脑出货1.476亿台,小米跃居第五

    2024年全球平板电脑市场强劲复苏,canalys报告显示出货量增长显著。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Canalys最新报告显示,2024年第四季度全球平板电脑出货量同比增长5.6%,达到3990万台,全年总出货量达1.…

    2026年10月20日 • 用户投稿
    100
  • 扬州毛绒玩具AI 火花创新峰会,共探玩具产业智变新升级

    扬州毛绒玩具AI 火花创新峰会,共探玩具产业智变新升级扬州毛绒玩具AI 火花创新峰会,共探玩具产业智变新升级扬州毛绒玩具AI 火花创新峰会,共探玩具产业智变新升级扬州毛绒玩具AI 火花创新峰会,共探玩具产业智变新升级

    2025年6月25日,“智链无界•玩聚未来—扬州毛绒玩具ai火花创新峰会”在扬成功举办。此次峰会由阿里云主办,邀请扬州市政府领导以及阿里巴巴集团代表、玩具行业先锋、技术专家、跨界智囊、毛绒玩具企业等齐聚瘦西湖畔,围绕ai技术赋能毛绒玩具产业升级,共探设计逻辑重构、交互体验创新与产业生态重塑路径,推动…

    2026年10月20日 • 用户投稿
    500
  • 京东秒送优惠券领取入口_京东秒送优惠券获取方法

    京东秒送优惠券领取入口_京东秒送优惠券获取方法京东秒送优惠券领取入口_京东秒送优惠券获取方法京东秒送优惠券领取入口_京东秒送优惠券获取方法京东秒送优惠券领取入口_京东秒送优惠券获取方法

    未领优惠券导致京东秒送价格偏高,可通过搜索“外卖777”领券、每晚20:00抢券、微信“支付有优惠”兑换、学生或PLUS认证叠加福利,实现多重减免。 如果您在京东秒送平台选购商品时发现价格偏高,很可能是未领取可用优惠券所致。通过正确渠道及时获取优惠券,可有效降低下单成本。 本文运行环境:华为P60,…

    2026年10月20日 • 用户投稿
    100
  • Spring Integration多实例IMAP邮件接收与去重指南

    本文探讨在Spring Integration多实例Spring Boot应用中,如何有效避免IMAP邮件的重复处理。我们将详细介绍利用IMAP协议的“已读”标记特性、Spring Integration的领导者选举机制以及幂等接收器模式,确保邮件在分布式环境中被唯一且可靠地消费,从而防止数据重复处…

    2026年10月20日
    200
  • 解决Gradle $projectDir 未知属性错误的指南

    解决Gradle $projectDir 未知属性错误的指南解决Gradle $projectDir 未知属性错误的指南解决Gradle $projectDir 未知属性错误的指南解决Gradle $projectDir 未知属性错误的指南

    本文旨在解决gradle构建脚本中常见的`could not get unknown property ‘$projectdir’`错误。该问题通常源于在`build.gradle`文件中引用`$projectdir`变量时,路径字符串缺少双引号,导致gradle将其误识别为…

    2026年10月20日 • 用户投稿
    100
  • windows10 Edge浏览器主页如何修改_Windows Edge浏览器主页设置方法

    windows10 Edge浏览器主页如何修改_Windows Edge浏览器主页设置方法windows10 Edge浏览器主页如何修改_Windows Edge浏览器主页设置方法windows10 Edge浏览器主页如何修改_Windows Edge浏览器主页设置方法windows10 Edge浏览器主页如何修改_Windows Edge浏览器主页设置方法

    首先通过“启动时”设置自定义主页,选择打开特定页面并添加目标网址;其次在“开始、主页和新建标签页”中启用主页按钮并设定跳转地址;最后检查第三方软件如360或腾讯电脑管家是否锁定主页,必要时关闭其主页保护功能以恢复用户自定义权限。 如果您发现Windows 10上的Edge浏览器主页不是您期望的页面,…

    2026年10月20日 • 用户投稿
    100
  • 《止痛药》新作预购宣传片 将于10月10日发售

    《止痛药》新作预购宣传片 将于10月10日发售《止痛药》新作预购宣传片 将于10月10日发售《止痛药》新作预购宣传片 将于10月10日发售《止痛药》新作预购宣传片 将于10月10日发售

    anshar studios与saber interactive近日宣布,《止痛药》系列新作将于10月10日正式上线。目前游戏已在平台开启预购,同时官方还释出了一段全新预告片,让我们一睹为快。 Steam商店页面:[查看详情](https://www.php.cn/link/af141196b05c…

    2026年10月20日 • 用户投稿
    200
  • VSCode如何实现代码模板快速应用 VSCode代码模板库的管理与使用

    VSCode如何实现代码模板快速应用 VSCode代码模板库的管理与使用VSCode如何实现代码模板快速应用 VSCode代码模板库的管理与使用VSCode如何实现代码模板快速应用 VSCode代码模板库的管理与使用VSCode如何实现代码模板快速应用 VSCode代码模板库的管理与使用

    vscode实现代码模板的快速应用,核心在于使用其内置的“代码片段”(snippets)功能,通过配置用户、工作区或扩展提供的片段,可为常用代码结构创建自定义模板,输入简短前缀即可展开,结合占位符、变量和智能提示实现高效输入。1. 使用“preferences: configure user sni…

    2026年10月20日 • 用户投稿
    300
  • windows桌面图标有蓝底阴影怎么去掉 桌面图标蓝底阴影的去除方法

    1、通过关闭ClearType文本或调整高级文本渲染设置可消除蓝底阴影;2、检查桌面图标显示模式并重新应用主题以刷新外观;3、在系统性能选项中取消勾选“在桌面上为图标标签使用阴影”;4、删除IconCache.db文件并重建图标缓存以修复显示异常。 如果您发现Windows桌面图标下方出现了蓝底阴影…

    2026年10月20日
    100
  • Java中利用正则表达式与后处理精确提取复杂字符串中的动态分组数据

    本文详细阐述了如何从结构复杂、包含动态分组的字符串中,精确提取特定信息。针对传统正则表达式在处理可变数量分组时的局限性,我们提出了一种两阶段解决方案:首先,利用强大的正则表达式进行初步匹配,捕获固定部分和所有动态数据作为一个整体;随后,通过程序化后处理,巧妙地将动态数据拆分为所需的多个独立分组。本教…

    2026年10月20日
    100
  • Java中链表对象引用的正确管理与实现

    Java中链表对象引用的正确管理与实现Java中链表对象引用的正确管理与实现Java中链表对象引用的正确管理与实现Java中链表对象引用的正确管理与实现

    在java中,尝试直接通过`this`关键字重新分配对象引用是不允许的。当实现链表等数据结构时,正确的做法是引入一个辅助的“节点”(node)类来封装数据和指向下一个元素的引用。主链表类则负责维护链表的头尾节点,并通过操作这些节点内部的引用来增删元素,而非直接修改链表对象本身的引用。 理解Java中…

    2026年10月20日 • 用户投稿
    100
  • 精通VSCode代码审查与质量检查工具集成

    精通VSCode代码审查与质量检查工具集成精通VSCode代码审查与质量检查工具集成精通VSCode代码审查与质量检查工具集成精通VSCode代码审查与质量检查工具集成

    配置VSCode代码审查工具链可提升代码质量与团队协作效率。首先集成ESLint、Pylint等静态分析工具,安装对应扩展并配置规则文件如.eslintrc.json,启用保存时自动修复功能;接着通过GitLens和GitHub Pull Requests扩展增强版本控制与代码评审,支持行级历史查看…

    2026年10月20日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信