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(""));
+ }
+
}