一键导入
分析给定的 JSON 请求数据是否与 Java 后台 DTO 定义吻合,检查字段缺失、字段名不匹配、类型不匹配、必填校验等问题。
npx skills add https://github.com/SakumyZ/skills --skill dto-validation-analyzer复制此命令并粘贴到 Claude Code 中以安装该技能
分析给定的 JSON 请求数据是否与 Java 后台 DTO 定义吻合,检查字段缺失、字段名不匹配、类型不匹配、必填校验等问题。
npx skills add https://github.com/SakumyZ/skills --skill dto-validation-analyzer复制此命令并粘贴到 Claude Code 中以安装该技能
为 Vue 3 + Ant Design Vue 表单系统新增自定义校验规则。支持正则校验、值范围校验、日期校验等。包含类型定义、校验实现、单元测试的完整流程。
将 AI 聊天内容提炼为结构化技术文档并保存到 Obsidian 知识库。支持三种文档类型:问题解决型、知识学习型、方案对比型。自动推断知识库分类目录,生成符合 Obsidian 规范的 Markdown 文件(含 frontmatter、双链)。适用于:(1) 聊天中解决了技术问题后想记录下来,(2) 学到新知识想沉淀到知识库,(3) 对比了多个方案后想保存决策过程。触发条件:用户说"保存到知识库"、"导出到 Obsidian"、"记录到笔记"、"保存这次对话"、"转成文档"等。
将Excel工作簿按工作表拆分为独立的Excel文件,每个工作表生成一个单独的文件。适用场景:(1) 将多工作表Excel文件拆分为单独文件,(2) 提取特定工作表为独立文件,(3) 分发合并工作簿中的工作表,(4) 为单独处理或分发创建工作表副本。
将 Excel 文件转换为 Markdown 表格,支持合并单元格处理、多工作表输出、基础字体语义(粗体/斜体)与超链接转换。适用于将式样书、数据表转为可读的 Markdown 文档。
自动化 GitHub PR 工作流 - 基于当前分支创建 PR、获取用户输入、检查冲突并自动合并。支持 squash 合并模式,遇到冲突时停止并提示用户。
将 Java DTO 类文件转换为 TypeScript interface,自动处理类型映射、@Required/@Schema 注解、嵌套类,并生成完整的 JSDoc 注释。
| name | dto-validation-analyzer |
| description | 分析给定的 JSON 请求数据是否与 Java 后台 DTO 定义吻合,检查字段缺失、字段名不匹配、类型不匹配、必填校验等问题。 |
分析用户提供的 JSON 请求数据是否与 Java 后台 DTO 类定义吻合,找出所有不匹配的问题。
当用户提供了一段 JSON 数据和一个 Java DTO 类定义(或文件路径),并要求检查数据是否与 DTO 吻合、能否通过 validation 时,使用本技能。
确定 DTO 字段的实际序列化名称,优先级如下:
@JsonProperty("name") 的值@Schema(name = "name") 的值(仅在框架使用 Schema name 做序列化时)重要:对比时使用 DTO 字段的序列化名称(而非 Java 字段名),与 JSON 中的 key 进行匹配。
检查项:
teikiBusu vs teikiBunBusu)识别以下注解标注的必填字段:
@Required@NotNull@NotBlank@NotEmpty检查 JSON 中这些字段是否:
@NotBlank)@NotEmpty)对比 JSON 中值的类型与 DTO 字段声明的类型:
| DTO Java 类型 | JSON 期望类型 | 常见问题 |
|---|---|---|
String | string | 发送了 number 或 boolean |
Integer / Long / int / long | number (整数) | 发送了 string 或小数 |
Double / Float / BigDecimal | number | 发送了 string |
Boolean / boolean | boolean | 发送了 string "true" |
List<T> / Set<T> | array | 发送了单个对象而非数组 |
Date / LocalDateTime 等 | string (日期格式) | 格式不正确 |
注意:Spring 默认的 Jackson 会自动做一些类型转换(如 number → String),但这属于隐式转换,仍应标记为⚠️ 提醒。
检查带格式注解的字段值是否符合要求:
@DateFormat("yyyyMM") → 值应匹配 yyyyMM 格式(如 "202603")@DateFormat("yyyyMMdd") → 值应匹配 yyyyMMdd 格式@Pattern(regexp = "...") → 值应匹配正则@TrueNumber → 值应为合法数字(字符串形式时也应为数字字符串)@Email → 值应为邮箱格式@Size(min=x, max=y) → 字符串长度或集合大小应在范围内List<T> 类型,对数组中的每一个元素进行分析,并在报告中标注是第几个元素出的问题@Valid 级联校验如果字段或泛型参数上有 @Valid 注解,说明 Spring 会对该嵌套对象/列表元素做级联校验,需要递归检查嵌套结构内的 validation 注解。
按照问题严重程度分组输出:
## 数据与 DTO 匹配分析报告
### ❌ 必定失败(Validation Error)
> 这些问题会导致请求被后台拒绝
| 级别 | 位置 | 问题 | 说明 |
|------|------|------|------|
| ... | ... | ... | ... |
### ⚠️ 潜在问题(Warning)
> 这些问题可能导致数据丢失或行为异常
| 级别 | 位置 | 问题 | 说明 |
|------|------|------|------|
| ... | ... | ... | ... |
### ℹ️ 信息提示(Info)
> 非必填且未发送的字段,不会导致错误
| 字段 | 说明 |
|------|------|
| ... | ... |
### ✅ 总结
简要概括主要问题和建议修复方向。
❌ 必定失败:
@Required / @NotNull / @NotBlank / @NotEmpty 标注的字段@DateFormat / @Pattern 要求⚠️ 潜在问题:
@TrueNumber 字段传了非字符串类型的数字ℹ️ 信息提示:
JSON 数据:
{
"seikyuKikanFrom": "202603",
"seikyuKikanTo": "202603",
"kodokuId": 19,
"kodokuInfo": {
"yusoKbn": "2",
"hinList": [
{
"hinCd": "01",
"kihonBusu": 1,
"teikiBunBusu": 0
}
]
}
}
Java DTO(关键部分):
@Data
public class CalcKdYsPriceReqDto {
@Required
@DateFormat("yyyyMM")
private String seikyuKikanFrom;
@Required
@DateFormat("yyyyMM")
private String targetMonth; // ← @Required
private Integer kodokuId;
@Valid
private KodokuInfo kodokuInfo;
public static class HinItem {
@TrueNumber
@Schema(name = "kihonBusu")
private String kihonBusu; // ← 类型是 String
@TrueNumber
@Schema(name = "teikiBusu") // ← 注意 Schema name
private String teikiBusu;
}
}
## 数据与 DTO 匹配分析报告
### ❌ 必定失败(Validation Error)
| 级别 | 位置 | 问题 | 说明 |
|------|------|------|------|
| ❌ | `targetMonth` | 缺少必填字段 | 标注了 `@Required` + `@DateFormat("yyyyMM")`,但 JSON 中未提供 |
### ⚠️ 潜在问题(Warning)
| 级别 | 位置 | 问题 | 说明 |
|------|------|------|------|
| ⚠️ | `kodokuInfo.hinList[0].teikiBunBusu` | 字段名不匹配 | JSON 用 `teikiBunBusu`,DTO @Schema name 为 `teikiBusu` |
| ⚠️ | `kodokuInfo.hinList[0].kihonBusu` | 类型隐式转换 | JSON 发送 number `1`,DTO 类型为 `String`,Jackson 会自动转换但不推荐 |
### ✅ 总结
主要问题是缺少必填字段 `targetMonth`。此外 `teikiBunBusu` 字段名与 DTO 不匹配,数据会丢失。