feat:增强对 JDK8 的兼容性

This commit is contained in:
YunaiV
2026-09-26 23:21:19 +08:00
parent 9efecd07ad
commit d7fb9c683e
13 changed files with 54 additions and 65 deletions
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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<FmsSubjectDO> subjects = new ArrayList<>();
@@ -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<Long, ?> cache = (LoadingCache<Long, ?>) 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"));
}
@@ -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.*;
@@ -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<String> ALLOWED_FILE_TYPES = Set.of(
private static final Set<String> 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)
@@ -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
@@ -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;
@@ -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;
@@ -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])?)*\\.?");
}
}
@@ -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()));