From 3078fe33907ce889747270ee82757a38cdb0d65f Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 3 May 2026 16:39:38 +0800 Subject: [PATCH] refactor(codegen):精简 CodegenBuilder.sanitizeComment 引号替换实现并补充单测 --- yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java | 25 ++++++++++++------------- yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java index 4a1897c..c8e710e 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum; import com.baomidou.mybatisplus.generator.config.po.TableField; import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Sets; import org.springframework.stereotype.Component; @@ -117,10 +118,8 @@ public class CodegenBuilder { table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); - // 处理表注释中的特殊字符,避免生成的代码编译错误(先转义,再去掉"表"字) - String tableComment = sanitizeColumnComment(table.getTableComment()); - // 去除结尾的表,作为类描述 - table.setClassComment(StrUtil.removeSuffixIgnoreCase(tableComment, "表")); + // 去除结尾的表,作为类描述;注释中的英文引号替换为中文引号,避免破坏生成代码中的字符串字面量 + table.setClassComment(StrUtil.removeSuffixIgnoreCase(sanitizeComment(table.getTableComment()), "表")); table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()); } @@ -130,8 +129,7 @@ public class CodegenBuilder { for (CodegenColumnDO column : columns) { column.setTableId(tableId); column.setOrdinalPosition(index++); - // 处理字段注释中的特殊字符,避免生成的代码编译错误 - column.setColumnComment(sanitizeColumnComment(column.getColumnComment())); + column.setColumnComment(sanitizeComment(column.getColumnComment())); // 特殊处理:Byte => Integer if (Byte.class.getSimpleName().equals(column.getJavaType())) { column.setJavaType(Integer.class.getSimpleName()); @@ -220,18 +218,19 @@ public class CodegenBuilder { column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"})); } } - + /** - * 清理字段注释中的特殊字符 - * 将英文引号替换为中文引号,避免生成的代码出现语法错误 + * 将注释中的英文引号替换为中文引号,避免破坏生成代码中的字符串字面量 * - * @param comment 原始字段注释 - * @return 清理后的字段注释 + * @param comment 原始注释 + * @return 清理后的注释 */ - private String sanitizeColumnComment(String comment) { + @VisibleForTesting + String sanitizeComment(String comment) { if (StrUtil.isEmpty(comment)) { return comment; } - return comment.replace("\"", "\u201c").replace("\"", "\u201d").replace("'", "\u2018").replace("'", "\u2019"); + return comment.replace('"', '“').replace('\'', '‘'); } + } diff --git a/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java b/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java index 7a26ea9..2622462 100644 --- a/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java +++ b/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java @@ -84,4 +84,19 @@ public class CodegenBuilderTest extends BaseMockitoUnitTest { assertEquals("input", column.getHtmlType()); } + @Test + public void testSanitizeComment() { + // 1. null / 空字符串:原样返回 + assertNull(codegenBuilder.sanitizeComment(null)); + assertEquals("", codegenBuilder.sanitizeComment("")); + // 2. 无英文引号:原样返回 + assertEquals("无引号注释", codegenBuilder.sanitizeComment("无引号注释")); + // 3. 含英文双引号:替换为中文左双引号 + assertEquals("含“双“引号", codegenBuilder.sanitizeComment("含\"双\"引号")); + // 4. 含英文单引号:替换为中文左单引号 + assertEquals("含‘单‘引号", codegenBuilder.sanitizeComment("含'单'引号")); + // 5. 双 / 单引号混合 + assertEquals("“混‘搭“‘", codegenBuilder.sanitizeComment("\"混'搭\"'")); + } + } -- libgit2 0.21.4