From d7fb9c683e5f3718004d4d66207b42d1064c78d0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 26 Sep 2026 23:21:19 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=BC=BA=E5=AF=B9=20JDK8?= =?UTF-8?q?=20=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vo/contract/CrmContractSaveReqVO.java | 4 +-- .../product/CrmProductServiceImpl.java | 2 +- .../vo/in/ErpPurchaseInSaveReqVO.java | 6 ++--- .../product/ErpProductServiceImpl.java | 2 +- .../report/FmsReportTemplateServiceTest.java | 22 ++++++++-------- .../ImSensitiveWordServiceImplTest.java | 16 +++++++----- .../app/file/AppFileController.java | 4 +-- .../infra/service/file/FileServiceImpl.java | 6 +++-- .../service/file/FileServiceImplTest.java | 6 ++--- .../admin/spu/vo/ProductSkuSaveReqVO.java | 6 ++--- .../MesWmItemReceiptDetailServiceImpl.java | 2 +- .../vo/provider/OaMailProviderSaveReqVO.java | 17 ------------ .../user/AdminUserServiceImplTest.java | 26 +++++++++---------- 13 files changed, 54 insertions(+), 65 deletions(-) diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java index 96bf0aee33..0d4416795b 100644 --- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java +++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/contract/CrmContractSaveReqVO.java @@ -6,8 +6,8 @@ import cn.iocoder.yudao.module.crm.framework.operatelog.core.CrmCustomerParseFun import cn.iocoder.yudao.module.crm.framework.operatelog.core.SysAdminUserParseFunction; import com.mzt.logapi.starter.annotation.DiffLogField; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.NotNull; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java index fbb2b16194..3b5197f2bb 100644 --- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java +++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java @@ -20,7 +20,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import com.mzt.logapi.context.LogRecordContext; import com.mzt.logapi.service.impl.DiffParseFunction; import com.mzt.logapi.starter.annotation.LogRecord; -import jakarta.annotation.Resource; +import javax.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java index ba2feb3460..aaf71c77b4 100644 --- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java +++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/in/ErpPurchaseInSaveReqVO.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.Valid; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.NotNull; +import javax.validation.Valid; +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; import lombok.Data; import java.math.BigDecimal; diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java index 65cb6fa634..b372b1a24e 100644 --- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java +++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/product/ErpProductServiceImpl.java @@ -18,7 +18,7 @@ import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseReturnService; import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOrderService; import cn.iocoder.yudao.module.erp.service.sale.ErpSaleOutService; import cn.iocoder.yudao.module.erp.service.sale.ErpSaleReturnService; -import jakarta.annotation.Resource; +import javax.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsReportTemplateServiceTest.java b/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsReportTemplateServiceTest.java index f5205ed86f..0fbcf17650 100644 --- a/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsReportTemplateServiceTest.java +++ b/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsReportTemplateServiceTest.java @@ -20,14 +20,14 @@ import cn.iocoder.yudao.module.fms.service.config.FmsInitialBalanceService; import cn.iocoder.yudao.module.fms.service.config.FmsSubjectService; import cn.iocoder.yudao.module.fms.service.ledger.FmsLedgerService; import cn.iocoder.yudao.module.fms.service.voucher.FmsVoucherService; -import jakarta.annotation.Resource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.core.io.FileSystemResource; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; -import org.springframework.test.context.bean.override.mockito.MockitoBean; +import javax.annotation.Resource; import javax.sql.DataSource; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -56,23 +56,23 @@ public class FmsReportTemplateServiceTest extends BaseDbUnitTest { @Resource private FmsCashFlowStatementServiceImpl cashFlowStatementService; - @MockitoBean + @MockBean private FmsAccountSetService accountSetService; - @MockitoBean + @MockBean private FmsSubjectService subjectService; - @MockitoBean + @MockBean private FmsLedgerService ledgerService; - @MockitoBean + @MockBean private FmsFinanceParameterService financeParameterService; - @MockitoBean + @MockBean private FmsInitialBalanceService initialBalanceService; - @MockitoBean + @MockBean private FmsClosingPeriodService closingPeriodService; - @MockitoBean + @MockBean private FmsClosingSchemeService closingSchemeService; - @MockitoBean + @MockBean private FmsClosingVoucherService closingVoucherService; - @MockitoBean + @MockBean private FmsVoucherService voucherService; private final List subjects = new ArrayList<>(); diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImplTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImplTest.java index 8d366b1933..fd365a4a3b 100644 --- a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImplTest.java +++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/service/sensitiveword/ImSensitiveWordServiceImplTest.java @@ -23,7 +23,6 @@ import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServic import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.MESSAGE_SENSITIVE_WORD_BLOCKED; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.SENSITIVE_WORD_DUPLICATED; import static cn.iocoder.yudao.module.im.enums.ErrorCodeConstants.SENSITIVE_WORD_NOT_EXISTS; -import static org.awaitility.Awaitility.await; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -107,7 +106,7 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest { public void testValidateText_tenantIsolation() { // mock 不同租户的词库 when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus())) - .thenAnswer(invocation -> List.of(ImSensitiveWordDO.builder() + .thenAnswer(invocation -> ListUtil.of(ImSensitiveWordDO.builder() .word(TenantContextHolder.getRequiredTenantId().equals(TENANT_ID) ? "firstbad" : "secondbad") .build())); @@ -137,7 +136,7 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest { sensitiveWordService.validateText("hello world"); verify(imSensitiveWordMapper).selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); // mock 删除后的词库 - when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus())).thenReturn(List.of()); + when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus())).thenReturn(ListUtil.of()); // 调用 sensitiveWordService.deleteSensitiveWordList(ListUtil.of(1L, 2L)); @@ -164,16 +163,21 @@ public class ImSensitiveWordServiceImplTest extends BaseMockitoUnitTest { return LocalDateTime.of(2026, 9, 2, 0, 0); }); when(imSensitiveWordMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus())) - .thenReturn(List.of(ImSensitiveWordDO.builder().word("newbad").build())); + .thenReturn(ListUtil.of(ImSensitiveWordDO.builder().word("newbad").build())); // 调用 LoadingCache cache = (LoadingCache) ReflectionTestUtils.getField( sensitiveWordService, "sensitiveWordBsCaches"); + Object oldCache = cache.getUnchecked(0L); cache.refresh(0L); // 断言缓存异步刷新 - await().atMost(Duration.ofSeconds(5)).untilAsserted(() -> - assertServiceException(() -> sensitiveWordService.validateText("newbad"), MESSAGE_SENSITIVE_WORD_BLOCKED)); + assertTimeoutPreemptively(Duration.ofSeconds(5), () -> { + while (cache.getUnchecked(0L) == oldCache) { + Thread.sleep(10); + } + }); + assertServiceException(() -> sensitiveWordService.validateText("newbad"), MESSAGE_SENSITIVE_WORD_BLOCKED); assertDoesNotThrow(() -> sensitiveWordService.validateText("badword")); } diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java index 0930dc03eb..ec0c837c72 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/controller/app/file/AppFileController.java @@ -11,8 +11,8 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; +import javax.annotation.Resource; +import javax.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; diff --git a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java index 30a98e065d..5f0f91330e 100644 --- a/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java +++ b/yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.infra.service.file; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; @@ -24,6 +25,7 @@ import lombok.SneakyThrows; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -42,7 +44,7 @@ public class FileServiceImpl implements FileService { /** * 允许上传的文件类型,可按业务需要调整 */ - private static final Set ALLOWED_FILE_TYPES = Set.of( + private static final Set ALLOWED_FILE_TYPES = Collections.unmodifiableSet(CollUtil.newHashSet( // 图片 "image/jpeg", "image/png", "image/gif", "image/webp", "image/bmp", "image/vnd.microsoft.icon", "image/tiff", "image/avif", "image/heic", "image/heif", "image/svg+xml", @@ -60,7 +62,7 @@ public class FileServiceImpl implements FileService { "audio/x-aac", "audio/x-flac", "audio/amr", "audio/x-ms-wma", "video/mp4", "video/quicktime", "video/x-msvideo", "video/webm", "video/x-ms-wmv", "video/x-flv", "application/x-matroska", "video/x-matroska" - ); + )); /** * 上传文件的前缀,是否包含日期(yyyyMMdd) diff --git a/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java b/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java index 8d1eaccab0..9a81da54a5 100644 --- a/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java +++ b/yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImplTest.java @@ -11,14 +11,14 @@ import cn.iocoder.yudao.module.infra.controller.admin.file.vo.file.FilePresigned import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO; import cn.iocoder.yudao.module.infra.dal.mysql.file.FileMapper; import cn.iocoder.yudao.module.infra.framework.file.core.client.FileClient; -import jakarta.annotation.Resource; +import javax.annotation.Resource; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; -import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.boot.test.mock.mockito.MockBean; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; @@ -45,7 +45,7 @@ public class FileServiceImplTest extends BaseDbUnitTest { @Resource private FileMapper fileMapper; - @MockitoBean + @MockBean private FileConfigService fileConfigService; @BeforeEach diff --git a/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java b/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java index 8123c4d847..d675442392 100755 --- a/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java +++ b/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSkuSaveReqVO.java @@ -1,9 +1,9 @@ package cn.iocoder.yudao.module.product.controller.admin.spu.vo; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import lombok.*; import java.util.List; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java index e0115f9bff..06d865202d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockSe import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; -import jakarta.annotation.Resource; +import javax.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; diff --git a/yudao-module-oa/src/main/java/cn/iocoder/yudao/module/oa/controller/admin/mail/vo/provider/OaMailProviderSaveReqVO.java b/yudao-module-oa/src/main/java/cn/iocoder/yudao/module/oa/controller/admin/mail/vo/provider/OaMailProviderSaveReqVO.java index 51e8c05e83..e317b68a40 100644 --- a/yudao-module-oa/src/main/java/cn/iocoder/yudao/module/oa/controller/admin/mail/vo/provider/OaMailProviderSaveReqVO.java +++ b/yudao-module-oa/src/main/java/cn/iocoder/yudao/module/oa/controller/admin/mail/vo/provider/OaMailProviderSaveReqVO.java @@ -88,23 +88,6 @@ public class OaMailProviderSaveReqVO { return sslEnable == null || !sslEnable.equals(starttlsEnable); } - /** - * 校验服务器主机名或 IP,不包含协议、路径和端口 - */ - @AssertTrue(message = "请输入有效的服务器域名或 IP 地址") - @JsonIgnore - public boolean isHostValid() { - if (StrUtil.isEmpty(host)) { - return true; - } - if (host.contains(":")) { - return Validator.isIpv6(host); - } - if (host.matches("\\d+(?:\\.\\d+){3}")) { - return host.matches("(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]?\\d)){3}"); - } - return host.matches("(?i)[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?(?:\\.[a-z\\d](?:[a-z\\d-]{0,61}[a-z\\d])?)*\\.?"); - } } diff --git a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java index 55aadc8b39..c6fe2e79d9 100644 --- a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java +++ b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java @@ -33,14 +33,14 @@ import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService; import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.permission.RoleService; import cn.iocoder.yudao.module.system.service.tenant.TenantService; -import jakarta.annotation.Resource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.test.context.bean.override.mockito.MockitoBean; +import javax.annotation.Resource; import java.util.Collection; import java.util.List; import java.util.Map; @@ -74,25 +74,25 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { @Resource private UserPostMapper userPostMapper; - @MockitoBean + @MockBean private DeptService deptService; - @MockitoBean + @MockBean private PostService postService; - @MockitoBean + @MockBean private PermissionService permissionService; - @MockitoBean + @MockBean private RoleService roleService; - @MockitoBean + @MockBean private PasswordEncoder passwordEncoder; - @MockitoBean + @MockBean private TenantService tenantService; - @MockitoBean + @MockBean private FileApi fileApi; - @MockitoBean + @MockBean private ConfigApi configApi; - @MockitoBean + @MockBean private OAuth2TokenService oauth2TokenService; - @MockitoBean + @MockBean private AdminUserProducer adminUserProducer; @BeforeEach @@ -363,7 +363,7 @@ public class AdminUserServiceImplTest extends BaseDbUnitTest { mockUserRole(adminUser.getId(), RoleCodeEnum.TENANT_ADMIN); // 调用,并断言整批未删除 - assertServiceException(() -> userService.deleteUserList(List.of(ordinaryUser.getId(), adminUser.getId())), + assertServiceException(() -> userService.deleteUserList(newArrayList(ordinaryUser.getId(), adminUser.getId())), USER_ADMIN_NOT_ALLOW_DELETE); assertNotNull(userMapper.selectById(ordinaryUser.getId())); assertNotNull(userMapper.selectById(adminUser.getId()));