Commit b639029e1be93b892a32c7b70c397a3ead699eed
1 parent
895c650c
fix: 对齐 PR1187 与 PR1204 修复
- 修复 WebProperties 嵌套属性级联校验 - 修复邮件模板代码块包含特殊字符时的替换异常 - 补充相关回归测试
Showing
3 changed files
with
20 additions
and
4 deletions
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 | } | ... | ... |