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 +17,19 @@ import jakarta.validation.constraints.NotNull; | ||
| 17 | public class WebProperties { | 17 | public class WebProperties { |
| 18 | 18 | ||
| 19 | @NotNull(message = "APP API 不能为空") | 19 | @NotNull(message = "APP API 不能为空") |
| 20 | + @Valid | ||
| 20 | private Api appApi = new Api("/app-api", "**.controller.app.**"); | 21 | private Api appApi = new Api("/app-api", "**.controller.app.**"); |
| 21 | @NotNull(message = "Admin API 不能为空") | 22 | @NotNull(message = "Admin API 不能为空") |
| 23 | + @Valid | ||
| 22 | private Api adminApi = new Api("/admin-api", "**.controller.admin.**"); | 24 | private Api adminApi = new Api("/admin-api", "**.controller.admin.**"); |
| 23 | 25 | ||
| 24 | @NotNull(message = "Admin UI 不能为空") | 26 | @NotNull(message = "Admin UI 不能为空") |
| 27 | + @Valid | ||
| 25 | private Ui adminUi; | 28 | private Ui adminUi; |
| 26 | 29 | ||
| 27 | @Data | 30 | @Data |
| 28 | @AllArgsConstructor | 31 | @AllArgsConstructor |
| 29 | @NoArgsConstructor | 32 | @NoArgsConstructor |
| 30 | - @Valid | ||
| 31 | public static class Api { | 33 | public static class Api { |
| 32 | 34 | ||
| 33 | /** | 35 | /** |
| @@ -53,7 +55,6 @@ public class WebProperties { | @@ -53,7 +55,6 @@ public class WebProperties { | ||
| 53 | } | 55 | } |
| 54 | 56 | ||
| 55 | @Data | 57 | @Data |
| 56 | - @Valid | ||
| 57 | public static class Ui { | 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,7 +166,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { | ||
| 166 | // 提取 <pre> 标签内的内容 | 166 | // 提取 <pre> 标签内的内容 |
| 167 | String innerContent = matcher.group(1); | 167 | String innerContent = matcher.group(1); |
| 168 | // 返回 div 标签包裹的内容 | 168 | // 返回 div 标签包裹的内容 |
| 169 | - matcher.appendReplacement(sb, "<div>" + innerContent + "</div>"); | 169 | + matcher.appendReplacement(sb, Matcher.quoteReplacement("<div>" + innerContent + "</div>")); |
| 170 | } | 170 | } |
| 171 | matcher.appendTail(sb); | 171 | matcher.appendTail(sb); |
| 172 | return sb.toString(); | 172 | return sb.toString(); |
| @@ -207,7 +207,8 @@ public class MailTemplateServiceImpl implements MailTemplateService { | @@ -207,7 +207,8 @@ public class MailTemplateServiceImpl implements MailTemplateService { | ||
| 207 | String codeBlock = matcher.group(1); | 207 | String codeBlock = matcher.group(1); |
| 208 | // 为代码块添加样式 | 208 | // 为代码块添加样式 |
| 209 | String replacement = "<pre style=\"background-color: #f5f5f5; padding: 10px; border-radius: 5px; overflow-x: auto;\"><code>" + codeBlock + "</code></pre>"; | 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 | matcher.appendTail(sb); | 213 | matcher.appendTail(sb); |
| 213 | return sb.toString(); | 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,4 +398,18 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { | ||
| 398 | assertFalse(formattedContent.contains("{activationLink}")); | 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 | } |