dOOv:Java 数据验证与映射库(简化业务逻辑)

dOOv 是一个为 Java 开发人员设计的轻量化库,专注于数据验证和对象间的映射。与传统的验证框架不同,dOOv 通过提供简洁、声明式的 API,使得开发者可以轻松地编写、扩展和维护验证和映射规则。其设计灵感源自领域驱动设计(DDD),非常适合复杂业务场景下的验证需求。本文将通过示例代码、功能列表和用例分析,全面介绍 dOOv 的核心功能。


⭕️宇宙起点
- 💯 dOOv 的优势
- 💯 dOOv 的基础使用
- 1. 声明式验证
- 2. 对象映射
- 💯 dOOv 高级功能
- 1. 复杂验证逻辑
- 2. 自定义验证规则
- 3. 自定义映射逻辑
- 💯 dOOv 的特性与使用场景
- 💯 dOOv 的实际应用场景
- 📥 下载地址
- 💬 结语
- 📒 参考文献
![]()
💯 dOOv 的优势
- 声明式验证与映射:通过简洁的 API 构建复杂的验证与映射规则,使代码更易读、易维护。
- 强类型安全:dOOv 使用 Java 泛型确保类型安全,从而减少运行时错误。
- 灵活可扩展:开发者可以通过扩展库内已有功能,自定义规则和映射。
- 适用于复杂业务场景:特别适合金融、保险、电子商务等需要多层次数据验证与对象映射的复杂领域。
- 验证结果报告:生成详尽的验证报告,帮助开发人员快速定位问题。
- 领域驱动设计支持:完美契合基于 DDD 的项目架构,使得业务逻辑与验证规则紧密结合。
![]()
💯 dOOv 的基础使用
1. 声明式验证
dOOv 的验证通过流式 API 实现,开发者可以方便地对对象进行属性验证。下面展示一个简单的用户信息验证示例:
import static org.dooov.sample.validation.dsl.DSL.*;public class ValidationExample {public static void main(String[] args) {// 验证规则:firstName 不能为空且年龄大于18岁ValidationRule rule = when(field(User::getFirstName).notNull().and(field(User::getAge).greaterOrEquals(18))).validate();User user = new User("John", 20);// 执行验证ValidationResult result = rule.executeOn(user);if (result.isValid()) {System.out.println("验证通过");} else {System.out.println("验证失败: " + result.getFailureCause());}}
}
在上述代码中,我们定义了一个 User 类,并为其属性 firstName 和 age 设置验证规则。该验证规则要求 firstName 不能为空,且 age 必须大于等于 18 岁。
2. 对象映射
dOOv 的映射功能让开发者可以轻松实现对象间的属性复制。以下示例展示了如何将一个 User 对象的属性映射到 UserDTO 对象:
import static org.dooov.sample.mapping.dsl.DSL.*;public class MappingExample {public static void main(String[] args) {User sourceUser = new User("John", 20);UserDTO targetDTO = new UserDTO();MappingRule mappingRule = map(field(User::getFirstName)).to(field(UserDTO::setFirstName)).and(map(field(User::getAge)).to(field(UserDTO::setAge)));// 执行映射mappingRule.executeOn(sourceUser, targetDTO);System.out.println("DTO 映射结果: " + targetDTO.getFirstName() + ", " + targetDTO.getAge());}
}
这个映射例子中,我们将 User 对象的 firstName 和 age 映射到目标对象 UserDTO 上。通过 dOOv 的 map() 方法,轻松实现对象间的数据传输。
![]()
💯 dOOv 高级功能
1. 复杂验证逻辑
dOOv 支持定义多层次复杂验证逻辑,允许开发者使用逻辑运算符(AND/OR)构建嵌套规则。以下示例展示了如何结合多个条件进行验证:
import static org.dooov.sample.validation.dsl.DSL.*;public class ComplexValidationExample {public static void main(String[] args) {ValidationRule complexRule = when(field(User::getFirstName).notNull().and(field(User::getAge).greaterOrEquals(18)).or(field(User::getEmail).matches("^(.+)@(.+)$")) // 验证邮箱格式).validate();User user = new User("John", null, "john@example.com");ValidationResult result = complexRule.executeOn(user);if (result.isValid()) {System.out.println("用户信息验证通过");} else {System.out.println("用户信息验证失败: " + result.getFailureCause());}}
}
在此示例中,dOOv 结合了 AND/OR 条件,允许用户通过 firstName 和 age 或邮箱格式的验证。
2. 自定义验证规则
dOOv 支持用户根据业务需求自定义验证规则,提供了极大的灵活性。以下是一个创建自定义年龄验证规则的例子:
public class CustomValidationRule {public static ValidationRule isAdult() {return when(field(User::getAge).greaterOrEquals(18)).validate();}public static void main(String[] args) {User user = new User("Anna", 16);ValidationRule rule = isAdult();ValidationResult result = rule.executeOn(user);if (result.isValid()) {System.out.println("用户是成年人");} else {System.out.println("用户未成年");}}
}
这个自定义规则用于验证用户是否成年,开发者可以将其复用于多个场景中,简化代码结构。
3. 自定义映射逻辑
除了默认的映射功能,dOOv 也支持创建自定义的映射逻辑。以下展示如何扩展 dOOv 映射规则:
import static org.dooov.sample.mapping.dsl.DSL.*;public class CustomMappingExample {public static void main(String[] args) {User sourceUser = new User("John", "Doe", 25);UserDTO targetDTO = new UserDTO();MappingRule customMappingRule = map(field(User::getFirstName)).to(field(UserDTO::setFirstName)).and(map(field(User::getLastName)).to((source, target) -> {target.setFullName(source.getFirstName() + " " + source.getLastName());})).and(map(field(User::getAge)).to(field(UserDTO::setAge)));customMappingRule.executeOn(sourceUser, targetDTO);System.out.println("映射结果: " + targetDTO.getFullName() + ", 年龄: " + targetDTO.getAge());}
}
在这个例子中,我们自定义了 LastName 映射逻辑,将 FirstName 和 LastName 组合成 FullName 并赋值给目标对象 UserDTO。
![]()
💯 dOOv 的特性与使用场景
| 特性 | 描述 | 示例代码 |
|---|---|---|
| 流式 API | 使用流式 API 创建验证和映射规则,代码清晰简洁。 | when(field(User::getFirstName).notNull()) |
| 验证逻辑 | 定义复杂的验证规则,比如非空、数值范围、字符串长度等。 | field(User::getAge).greaterOrEquals(18) |
| 对象映射 | 支持对象间的映射,可以轻松地将一个对象的属性复制到另一个对象中。 | map(field(User::getFirstName)).to(field(UserDTO::setFirstName)) |
| 自定义规则 | 可以根据业务需求,扩展库中的验证和映射规则。 | CustomRule customRule = new CustomRule(); |
| 强类型安全 | 通过泛型和类型检查,确保在编译时检测到错误,减少运行时异常。 | - |
| 领域驱动设计支持 | dOOv 基于领域驱动设计的思想,特别适用于复杂的业务场景,比如用户输入验证、订单管理等。 | - |
| 报告生成 | 生成详细的验证报告,包含失败原因和通过的验证条件。 | ValidationResult result = rule.executeOn(user); |
| 自定义映射逻辑 | 可以创建自定义映射规则,将多个源对象属性映射到目标对象。 | map((source, target) -> {...}) |
![]()
💯 dOOv 的实际应用场景
- 用户输入表单验证:dOOv 可以用来验证前端输入的表单数据,比如用户注册或登录时的基本信息。
- 订单管理系统:在电子商务系统中,可以使用 dOOv 来验证订单的正确性,如订单金额、库存是否充足等。
- 复杂对象映射:适用于 DTO 转换、对象数据迁移等场景,特别是在需要跨系统或数据库进行数据同步时。
![]()
📥 下载地址
dOOv 最新版 下载地址
![]()
💬 结语
dOOv 是一个简洁而强大的 Java 数据验证与映射库,提供了流畅的 API 和灵活的扩展性,适合各类业务场景中的数据验证和映射需求。从简单的属性验证到复杂的对象映射,dOOv 都能提供可靠的解决方案。
![]()
📒 参考文献
- dOOv 官网
- dOOv GitHub仓库



相关文章:
dOOv:Java 数据验证与映射库(简化业务逻辑)
dOOv 是一个为 Java 开发人员设计的轻量化库,专注于数据验证和对象间的映射。与传统的验证框架不同,dOOv 通过提供简洁、声明式的 API,使得开发者可以轻松地编写、扩展和维护验证和映射规则。其设计灵感源自领域驱动设计(DDD&…...
Arthas sc(查看JVM已加载的类信息 )
文章目录 二、命令列表2.2 class/classloader相关命令2.2.5 sc(查看JVM已加载的类信息 )举例1:模糊搜索,xx包下所有的类举例2:打印类的详细信息举例3:打印出类的Field信息 本人其他相关文章链接 二、命令列…...
OCR 行驶证识别 离线识别
目录 正页识别 副页识别 全部识别 OCR 行驶证识别 离线识别 正页识别 副页识别 全部识别...
PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程
介绍: 真正的好东西,搞网站优化seo从业必备。可以快速提升网站权重,带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…...
LeetCode题练习与总结:丑数--263
一、题目描述 丑数 就是只包含质因数 2、3 和 5 的正整数。 给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:n 6 输出:true 解释࿱…...
初识C语言(五)
前言 本文章就代表C语言介绍以及了解正式完成,后续进行具体分析和详细解析学习。知识根深蒂固才可以应付后来的学习,地基要打好,后续才会轻松。 十四、结构体 结构体是C语言中最最重要的知识点,使得C语言有能力描述复杂的类型。 …...
Linux:深入理解冯诺依曼结构与操作系统
目录 1. 冯诺依曼体系结构 1.1 结构分析 1.2 存储结构分布图 2. 操作系统 2.1 概念 2.2 如何管理 2.3 什么是系统调用和库函数 1. 冯诺依曼体系结构 1.1 结构分析 不管是何种计算机,如个人笔记本电脑,服务器,都是遵循冯诺依曼结构。…...
面试中顺序表常考的十大题目解析
在数据结构与算法的面试中,顺序表是一个常见的考点。它作为一种基础的数据结构,涵盖了多种操作和概念,以下将详细介绍面试中关于顺序表常考的十大题目。 💝💝💝如果你对顺序表的概念与理解还存在疑惑&#…...
测试管理新增视图与高级搜索功能,测试计划支持一键生成缺陷详情,MeterSphere开源持续测试工具v3.3版本发布
2024年9月29日,MeterSphere开源持续测试工具正式发布v3.3版本。 在这一版本中,接口测试方面,接口导入功能支持导入Postman、JMX、HAR和MeterSphere格式的文件,接口场景的自定义请求步骤支持cURL快捷导入;测试管理方面…...
TypeScript 算法手册 【归并排序】
文章目录 1. 归并排序简介1.1 归并排序定义1.2 归并排序特点 2. 归并排序步骤过程拆解2.1 分割数组2.2 递归排序2.3 合并有序数组 3. 归并排序的优化3.1 原地归并排序3.2 混合插入排序案例代码和动态图 4. 归并排序的优点5. 归并排序的缺点总结 【 已更新完 TypeScript 设计模式…...
生信名词|MOA|基因敲低与基因敲除|DMSO|MODZ|生信基础
生信名词|MOA|基因敲低与基因敲除|DMSO|MODZ|生信基础 MOA(Mechanisms Of Action,作用机理) 过去,在药物投入到临床使用之前,它的生物学机理往往未被研究透彻。如今,随着技术的发展,一种新药物…...
基础岛第3关:浦语提示词工程实践
模型部署 使用下面脚本测试模型 from huggingface_hub import login, snapshot_download import osos.environ[HF_ENDPOINT] https://hf-mirror.comlogin(token“your_access_token")models ["internlm/internlm2-chat-1_8b"]for model in models:try:snapsh…...
vscode中配置python虚拟环境
python虚拟环境作用 Python虚拟环境允许你为每个独立的项目创建一个隔离的环境,这样每个项目都可以拥有自己的一套Python安装包和依赖,不会互相影响。实际使用中,可以在vscode或pycharm中使用虚拟环境。 1.创建虚拟环境的方法: …...
chatGPT对我学术写作的三种帮助
chatGPT对我学术写作的三种帮助 概述提高学术写作水平大模型选择概述上下文以提供精确的指令 提升同行评审优化编辑反馈 概述 从生成式人工智能中获得的价值并非来自于技术本身盲目地输出文本,而是来自于与工具的互动,并利用自身的专业知识来完善它所生…...
【PostgreSQL 】入门篇——支持的各种数据类型介绍,包括整数、浮点数、字符串、日期、JSON、数组等
1. 整数类型 1.1 SMALLINT 描述:用于存储小范围的整数值。大小:2 字节范围:-32,768 到 32,767使用场景:适合存储小型计数器、状态码等。示例: CREATE TABLE status_codes (id SMALLINT PRIMARY KEY,description TEX…...
野火STM32F103VET6指南者开发板入门笔记:【1】点亮RGB
硬件介绍 提示:本文是基于野火STM32F103指南者开发板所写例程,其他开发板请自行移植到自己的工程项目当中即可。 RGB-LEDPin引脚:低电平-点亮,高电平-熄灭REDPB5GREENPB0BLUEPB1 文章目录 硬件介绍软件介绍:结构体方式…...
数据工程师岗位常见面试问题-3(附回答)
数据工程师已成为科技行业最重要的角色之一,是组织构建数据基础设施的骨干。随着企业越来越依赖数据驱动的决策,对成熟数据工程师的需求会不断上升。如果您正在准备数据工程师面试,那么应该掌握常见的数据工程师面试问题:包括工作…...
强大的JVM监控工具
介绍 在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的 名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用…...
python 实现点的多项式算法
点的多项式算法介绍 点的多项式算法通常指的是通过一组点(即数据点,通常包括自变量和因变量的值)来拟合一个多项式函数的方法。这种方法在数值分析、统计学、机器学习等领域中非常常见。下面是一些常见的多项式拟合算法: 1. 最小…...
Pikachu-暴力破解-验证码绕过(on client)
访问页面, 从burpsuite 上看到返回的源代码; 验证码生成时通过 createCode 方法生成,在前端页面生成; 同时也是在前端做的校验; 直接验证;F12 -- 网络,随便输入个账号、密码、验证码࿰…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
