Browse Source

✨ 增加 jakartaPackage 标识,统一 Spring Boot 2.X 和 3.X 代码生成的模版

YunaiV 1 year ago
parent
commit
5e8988b73b

+ 16 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.template.TemplateConfig;
 import cn.hutool.extra.template.TemplateEngine;
 import cn.hutool.extra.template.engine.velocity.VelocityEngine;
+import cn.hutool.system.SystemUtil;
 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -35,10 +36,11 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableTable;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Table;
-import org.springframework.stereotype.Component;
-
 import jakarta.annotation.PostConstruct;
 import jakarta.annotation.Resource;
+import lombok.Setter;
+import org.springframework.stereotype.Component;
+
 import java.util.*;
 
 import static cn.hutool.core.map.MapUtil.getStr;
@@ -156,6 +158,15 @@ public class CodegenEngine {
     @Resource
     private CodegenProperties codegenProperties;
 
+    /**
+     * 是否使用 jakarta 包,用于解决 Spring Boot 2.X 和 3.X 的兼容性问题
+     *
+     * true  - 使用 jakarta.validation.constraints.*
+     * false - 使用 javax.validation.constraints.*
+     */
+    @Setter // 允许设置的原因,是因为单测需要手动改变
+    private Boolean jakartaEnable;
+
     /**
      * 模板引擎,由 hutool 实现
      */
@@ -170,6 +181,8 @@ public class CodegenEngine {
         TemplateConfig config = new TemplateConfig();
         config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH);
         this.templateEngine = new VelocityEngine(config);
+        // 设置 javaxEnable,按照是否使用 JDK17 来判断
+        this.jakartaEnable = SystemUtil.getJavaInfo().isJavaVersionAtLeast(1700); // 17.00 * 100
     }
 
     @PostConstruct
@@ -179,6 +192,7 @@ public class CodegenEngine {
         globalBindingMap.put("basePackage", codegenProperties.getBasePackage());
         globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage()
                 + '.' + "framework"); // 用于后续获取测试类的 package 地址
+        globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax");
         // 全局 Java Bean
         globalBindingMap.put("CommonResultClassName", CommonResult.class.getName());
         globalBindingMap.put("PageResultClassName", PageResult.class.getName());

+ 4 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/controller.vm

@@ -1,7 +1,7 @@
 package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName};
 
 import org.springframework.web.bind.annotation.*;
-import jakarta.annotation.Resource;
+import ${jakartaPackage}.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 #if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end
 
@@ -9,9 +9,9 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Operation;
 
-import jakarta.validation.constraints.*;
-import jakarta.validation.*;
-import jakarta.servlet.http.*;
+import ${jakartaPackage}.validation.constraints.*;
+import ${jakartaPackage}.validation.*;
+import ${jakartaPackage}.servlet.http.*;
 import java.util.*;
 import java.io.IOException;
 

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/controller/vo/saveReqVO.vm

@@ -3,7 +3,7 @@ package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePac
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
-import jakarta.validation.constraints.*;
+import ${jakartaPackage}.validation.constraints.*;
 ## 处理 BigDecimal 字段的引入
 #foreach ($column in $columns)
 #if (${column.javaType} == "BigDecimal")

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/service.vm

@@ -1,7 +1,7 @@
 package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
 
 import java.util.*;
-import jakarta.validation.*;
+import ${jakartaPackage}.validation.*;
 import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
 import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
 ## 特殊:主子表专属逻辑

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/service/serviceImpl.vm

@@ -1,7 +1,7 @@
 package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
 
 import org.springframework.stereotype.Service;
-import jakarta.annotation.Resource;
+import ${jakartaPackage}.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 

+ 2 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/java/test/serviceTest.vm

@@ -4,7 +4,7 @@ import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.mock.mockito.MockBean;
 
-import jakarta.annotation.Resource;
+import ${jakartaPackage}.annotation.Resource;
 
 import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest;
 
@@ -13,7 +13,7 @@ import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.business
 import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper;
 import ${PageResultClassName};
 
-import jakarta.annotation.Resource;
+import ${jakartaPackage}.annotation.Resource;
 import org.springframework.context.annotation.Import;
 import java.util.*;
 import java.time.LocalDateTime;

+ 2 - 0
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngineAbstractTest.java

@@ -45,7 +45,9 @@ public abstract class CodegenEngineAbstractTest extends BaseMockitoUnitTest {
 
     @BeforeEach
     public void setUp() {
+        codegenEngine.setJakartaEnable(true); // 强制使用 jakarta,保证单测可以基于 jakarta 断言
         codegenEngine.initGlobalBindingMap();
+        // 单测强制使用
         // 获取测试文件 resources 路径
         String absolutePath = FileUtil.getAbsolutePath("application-unit-test.yaml");
         // 系统不一样生成的文件也有差异,那就各自生成各自的