Commit b639029e1be93b892a32c7b70c397a3ead699eed

Authored by YunaiV
1 parent 895c650c

fix: 对齐 PR1187 与 PR1204 修复

- 修复 WebProperties 嵌套属性级联校验
- 修复邮件模板代码块包含特殊字符时的替换异常
- 补充相关回归测试
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;
17 17 public class WebProperties {
18 18  
19 19 @NotNull(message = "APP API 不能为空")
  20 + @Valid
20 21 private Api appApi = new Api("/app-api", "**.controller.app.**");
21 22 @NotNull(message = "Admin API 不能为空")
  23 + @Valid
22 24 private Api adminApi = new Api("/admin-api", "**.controller.admin.**");
23 25  
24 26 @NotNull(message = "Admin UI 不能为空")
  27 + @Valid
25 28 private Ui adminUi;
26 29  
27 30 @Data
28 31 @AllArgsConstructor
29 32 @NoArgsConstructor
30   - @Valid
31 33 public static class Api {
32 34  
33 35 /**
... ... @@ -53,7 +55,6 @@ public class WebProperties {
53 55 }
54 56  
55 57 @Data
56   - @Valid
57 58 public static class Ui {
58 59  
59 60 /**
... ...
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java
... ... @@ -166,7 +166,7 @@ public class MailTemplateServiceImpl implements MailTemplateService {
166 166 // 提取 <pre> 标签内的内容
167 167 String innerContent = matcher.group(1);
168 168 // 返回 div 标签包裹的内容
169   - matcher.appendReplacement(sb, "<div>" + innerContent + "</div>");
  169 + matcher.appendReplacement(sb, Matcher.quoteReplacement("<div>" + innerContent + "</div>"));
170 170 }
171 171 matcher.appendTail(sb);
172 172 return sb.toString();
... ... @@ -207,7 +207,8 @@ public class MailTemplateServiceImpl implements MailTemplateService {
207 207 String codeBlock = matcher.group(1);
208 208 // 为代码块添加样式
209 209 String replacement = "<pre style=\"background-color: #f5f5f5; padding: 10px; border-radius: 5px; overflow-x: auto;\"><code>" + codeBlock + "</code></pre>";
210   - matcher.appendReplacement(sb, replacement);
  210 + // 代码块内容可能包含 $ 或 \\,需要 quoteReplacement,否则会抛 IllegalArgumentException: Illegal group reference
  211 + matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
211 212 }
212 213 matcher.appendTail(sb);
213 214 return sb.toString();
... ...
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java
... ... @@ -398,4 +398,18 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest {
398 398 assertFalse(formattedContent.contains("{activationLink}"));
399 399 }
400 400  
  401 + @Test
  402 + public void testFormatMailTemplateContent_dollarInCodeBlock() {
  403 + // 准备参数
  404 + Map<String, Object> params = new HashMap<>();
  405 +
  406 + // 测试代码块中包含 $ 与 \\(历史上 appendReplacement 会抛 IllegalArgumentException: Illegal group reference)
  407 + String content = "<pre><code>echo $HOME && ls \\root</code></pre>";
  408 +
  409 + // 调用,并断言内容原样保留
  410 + String result = mailTemplateService.formatMailTemplateContent(content, params);
  411 + assertTrue(result.contains("echo $HOME && ls \\root"));
  412 + assertTrue(result.contains("<div><code>"));
  413 + }
  414 +
401 415 }
... ...