计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
java-dto-converter【效率与协作】Use when creating DTOs and MapStruct converters in Spring Boot layered projects. Covers naming, validation annotations, OpenAPI schemas, enum serialization, and update and response mapping patterns.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
为分层架构项目创建规范的 DTO(数据传输对象)和 MapStruct Converter(对象转换器)。
@AfterMapping| 用途 | 命名 | 示例 |
|---|---|---|
| 创建 | {Resource}CreateReq | PolicyCreateReq |
| 更新 | {Resource}UpdateReq | PolicyUpdateReq |
| 分页查询 | {Resource}PageReq | PolicyPageReq |
| 批量操作 | {Resource}BatchReq | TaskBatchReq |
| 用途 | 命名 | 示例 |
|---|---|---|
| 列表卡片 | {Resource}Card | PolicyCard |
| 详情 | {Resource}Detail | PolicyDetail |
| 通用响应 | {Resource}Resp | VideoSourceResp |
| 批量结果 | {Resource}BatchResp | TaskBatchResp |
| 类 | 用途 |
|---|---|
IdResp | 创建操作返回 ID |
PageReq | 分页请求基类 (page, size) |
PageResult<T> | 偏移分页结果 (records, total, page, size) |
CursorPageResult<T> | 游标分页结果 (records, nextCursor, hasMore, count) |
完整示例见 reference.md。
DTO 按业务模块分子目录:
dto/
├── policy/
│ ├── PolicyCreateReq.java
│ ├── PolicyUpdateReq.java
│ ├── PolicyCard.java
│ └── PolicyDetail.java
├── task/
│ ├── AnalysisTaskCreateReq.java
│ └── ...
├── ApiResponse.java
├── IdResp.java
├── PageReq.java
├── PageResult.java
└── CursorPageResult.java
请求 / 更新 / 响应 / 详情 / 分页 DTO 的完整模板见 reference.md。
@NotBlank / @NotNull / @NotEmpty@EqualsAndHashCode(callSuper = true) 和 @ToString(callSuper = true)PageReq,筛选字段只放业务查询条件设计策略: 若业务要求全量更新(每次提交完整数据),则 UpdateReq 可加必填校验,与 CreateReq 类似。
| 注解 | 用途 | 示例 |
|---|---|---|
@Schema(description, example) | OpenAPI 字段说明 | @Schema(description = "用户名", example = "张三") |
@NotBlank | 字符串非空 | 必填 String 字段 |
@NotNull | 非 null | 必填枚举/对象字段 |
@NotEmpty | 集合非空 | 必填 List 字段 |
@JsonFormat(pattern) | JSON 日期格式 | "yyyy-MM-dd HH:mm:ss" |
@JsonProperty | JSON 字段名 | @JsonProperty("sourceId") |
@DateTimeFormat(pattern) | 查询参数日期解析 | GET 请求的日期参数 |
DTO 中使用枚举类型时,需明确 JSON 序列化/反序列化策略。完整示例见 reference.md。
| 注解 | 用途 |
|---|---|
@JsonValue | 控制枚举序列化输出(推荐使用业务值而非 name/ordinal) |
@JsonCreator | 控制枚举反序列化匹配逻辑 |
所有 Converter 共享的配置,自动忽略未映射字段,无需逐个 @Mapping(ignore=true):
完整 ConverterConfig 示例见 reference.md。
推荐策略: 优先使用
config = ConverterConfig.class(简洁、统一)。仅在需要显式控制映射关系(如字段名不同、常量赋值)时才使用@Mapping。
完整接口模板见 reference.md。
不使用 ConverterConfig 的写法: 将
@Mapper(config = ConverterConfig.class)替换为@Mapper(componentModel = "spring"),并手动添加@Mapping(target = "id", ignore = true)等忽略注解。
| 方法 | 用途 |
|---|---|
toEntity(Req) | 请求 DTO → 新 Entity(创建) |
updateEntity(Req, @MappingTarget Entity) | 请求 DTO 合并到已有 Entity(更新) |
toCard(Entity) | Entity → 列表卡片 DTO |
toDetail(Entity) | Entity → 详情 DTO |
toResp(Entity) | Entity → 通用响应 DTO |
toCards(List) | 批量转换 |
@Mapping(target = "id", ignore = true)@Mapping(source = "sort", target = "sortOrder")@Mapping(target = "status", constant = "DISABLED")@Mapping(target = "syncTime", expression = "java(...)")@Mapping(target = "typeName", source = "entity.modelType.label")用于 MapStruct 自动映射后的补充逻辑(组装显示名称、计算派生字段等)。完整示例见 reference.md。
null 值处理: 简单的 null → 默认值场景优先使用
@BeanMapping(nullValuePropertyMappingStrategy)或ConverterConfig级别配置,@AfterMapping保留给需要自定义逻辑的场景。
用于枚举、时间戳等需要逻辑的转换,完整示例见 reference.md。
当 Entity 含有嵌套对象需要转换时,使用 uses 引入其他 Converter。完整示例见 reference.md。
当 DTO → Entity 转换时,以下字段必须 ignore(由框架自动填充):
| 字段 | 原因 |
|---|---|
id | 数据库自增 |
deleted | 默认值 0 |
createTime / updateTime | MetaObjectHandler 自动填充 |
createUser / updateUser | MetaObjectHandler 自动填充 |
versionNum | 默认值 1 |
当 Entity → DTO 转换时,以下字段由 Facade 层填充,Converter 应 ignore:
agentNames, regionPath, deviceGroups)sourceCount, taskCount)编写前:
ConverterConfig完成后:
@SchemaupdateEntity(..., @MappingTarget ...)| 错误做法 | 正确做法 |
|---|---|
| CreateReq 和 UpdateReq 完全复用同一套必填校验 | 根据业务决定 UpdateReq 是否允许部分更新 |
| 在 Converter 里组装大量跨服务关联数据 | 把关联丰富逻辑放到 Facade / Service |
DTO → Entity 时覆盖 id、createTime 等自动字段 | 明确 ignore 自动维护字段 |
用 ordinal 序列化枚举 | 显式使用业务值并配合 @JsonValue / @JsonCreator |