diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java index 8091e9a..e16ec21 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java @@ -17,17 +17,19 @@ import jakarta.validation.constraints.NotNull; public class WebProperties { @NotNull(message = "APP API 不能为空") + @Valid private Api appApi = new Api("/app-api", "**.controller.app.**"); @NotNull(message = "Admin API 不能为空") + @Valid private Api adminApi = new Api("/admin-api", "**.controller.admin.**"); @NotNull(message = "Admin UI 不能为空") + @Valid private Ui adminUi; @Data @AllArgsConstructor @NoArgsConstructor - @Valid public static class Api { /** @@ -53,7 +55,6 @@ public class WebProperties { } @Data - @Valid public static class Ui { /** diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java index 2c3f413..b02bd28 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java @@ -166,7 +166,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { // 提取
 标签内的内容
             String innerContent = matcher.group(1);
             // 返回 div 标签包裹的内容
-            matcher.appendReplacement(sb, "
" + innerContent + "
"); + matcher.appendReplacement(sb, Matcher.quoteReplacement("
" + innerContent + "
")); } matcher.appendTail(sb); return sb.toString(); @@ -207,7 +207,8 @@ public class MailTemplateServiceImpl implements MailTemplateService { String codeBlock = matcher.group(1); // 为代码块添加样式 String replacement = "
" + codeBlock + "
"; - matcher.appendReplacement(sb, replacement); + // 代码块内容可能包含 $ 或 \\,需要 quoteReplacement,否则会抛 IllegalArgumentException: Illegal group reference + matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement)); } matcher.appendTail(sb); return sb.toString(); diff --git a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java index af0211e..046a2ef 100755 --- a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java +++ b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java @@ -398,4 +398,18 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { assertFalse(formattedContent.contains("{activationLink}")); } + @Test + public void testFormatMailTemplateContent_dollarInCodeBlock() { + // 准备参数 + Map params = new HashMap<>(); + + // 测试代码块中包含 $ 与 \\(历史上 appendReplacement 会抛 IllegalArgumentException: Illegal group reference) + String content = "
echo $HOME && ls \\root
"; + + // 调用,并断言内容原样保留 + String result = mailTemplateService.formatMailTemplateContent(content, params); + assertTrue(result.contains("echo $HOME && ls \\root")); + assertTrue(result.contains("
")); + } + }