diff --git a/bin/code-generator-0.0.1-SNAPSHOT.jar b/bin/code-generator-0.0.1-SNAPSHOT.jar index 1fe6849e4c203682498c254276bd6fcc31547a0f..ffc034a99b6b0e006678c4b609d36891ddcb2852 100644 Binary files a/bin/code-generator-0.0.1-SNAPSHOT.jar and b/bin/code-generator-0.0.1-SNAPSHOT.jar differ diff --git a/bin/example/example.txt b/bin/example/example.txt index d5562aad878e08cd93fedc5c7cb2dbe88f72abb5..4d417683bfc4fe4a810a30db54428545756dbd59 100644 --- a/bin/example/example.txt +++ b/bin/example/example.txt @@ -2,6 +2,6 @@ theme_id theme_name organ_id organ_name -last_updated:Date -product_count:Integer -collect_count:Integer \ No newline at end of file +last_updated:datetime +product_count:int +collect_count:timestamp diff --git a/pom.xml b/pom.xml index b2ae2409e61a7f77247d90b5361e910195bfc9e8..d187912bc1a25dc1fbdd242ceab27373175a6b43 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,12 @@ guava 27.1-jre + + + dom4j + dom4j + 1.6.1 + diff --git a/src/main/java/org/bravof/analysis/DataProcessor.java b/src/main/java/org/bravof/analysis/DataProcessor.java index 32e862eaeb5c2cd4ea6dcca91d6b48035ca1058a..674039bffb12949cbe5215b9a5f8955eab8ba5d1 100644 --- a/src/main/java/org/bravof/analysis/DataProcessor.java +++ b/src/main/java/org/bravof/analysis/DataProcessor.java @@ -3,11 +3,11 @@ package org.bravof.analysis; import lombok.extern.log4j.Log4j2; import org.bravof.common.Constants; import org.bravof.common.FileTypeEnum; +import org.bravof.common.PropertyUtil; import org.bravof.generate.DTOGenerator; import org.bravof.generate.MapperGenerator; import org.bravof.generate.POGenerator; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -23,14 +23,8 @@ import java.util.Map; @Log4j2 @Component public class DataProcessor { - /** - * 配置文件中获取的文件路径 - */ - @Value("${file_absolute_path}") - private String fileAbsolutePath; - - @Value("${optional_file_type}") - private String optionalFileType; + @Autowired + private PropertyUtil propertyUtil; @Autowired private POGenerator poGenerator; @@ -43,62 +37,91 @@ public class DataProcessor { public void generatorDataMap() { try { - FileReader fileReader = new FileReader(new File(fileAbsolutePath)); + FileReader fileReader = new FileReader(new File(propertyUtil.getSourceFileAbsolutePath())); BufferedReader bufferedReader = new BufferedReader(fileReader); - List> fieldMapList = new ArrayList<>(); + List> javaMapList = new ArrayList<>(); + List> xmlMapList = new ArrayList<>(); String eachLine; while(true) { eachLine = bufferedReader.readLine(); //读到空行,终止程序 if(StringUtils.isEmpty(eachLine)) break; - //存储成员变量名称,及其变量类型 - Map keyValueMap = new LinkedHashMap<>(); + //存储成员变量原名称,及其变量类型 + Map fieldAndJavaType = new LinkedHashMap<>(); + //存储成员变量原名称,及其映射文件类型 + Map fieldAndMapperType = new LinkedHashMap<>(); //处理读取的数据,删除下划线,并且将下划线后面的一个字符转为大写 String[] fieldArray = eachLine.trim().split(Constants.COLON); - //如果指定了数据类型 + //如果指定了Java数据类型 if(fieldArray.length == 2) { - keyValueMap.put(fieldArray[0], fieldArray[1]); - }else { - //如果未指定数据类型,默认设为String - keyValueMap.put(fieldArray[0], Constants.STRING); + //原生数据库字段类型 + String sqlType = fieldArray[1]; + //从配置类获取数据库字段的Java数据类型映射 + String javaTypeStr = Constants.mySQLTypeMap.get(sqlType); + fieldAndJavaType.put(fieldArray[0], javaTypeStr); + + fieldAndMapperType.put(fieldArray[0], sqlType); + } else { + //如果未指定数据类型,Java默认设为String + fieldAndJavaType.put(fieldArray[0], Constants.STRING); + //如果未指定数据类型,数据库默认设为VARCHAR + fieldAndMapperType.put(fieldArray[0], Constants.VARCHAR); } - fieldMapList.add(keyValueMap); + + + javaMapList.add(fieldAndJavaType); + xmlMapList.add(fieldAndMapperType); } + System.out.println("\r"); + log.info("配置文件配置项列表"); + log.info("---------------->>>>>>"); + log.info("源数据文件路径 -> {}", propertyUtil.getSourceFileAbsolutePath()); + log.info("文件生成目录 -> {}", propertyUtil.getOutPutFilePath()); + log.info("文件包名前缀 -> {}", propertyUtil.getPackNamePrefix()); + log.info("所需要生成的文件类型 -> {}", propertyUtil.getOptionalFileType()); + log.info("原始类名称 -> {}", propertyUtil.getClassName()); + log.info("DTO和PO中需要导入的包名(全名称) -> {}", propertyUtil.getImportListStr()); + log.info("DTO和PO中需要添加的类注解 -> {}", propertyUtil.getAnnotationListStr()); + log.info("DTO和PO中需要实现的接口 -> {}", propertyUtil.getImplementListStr()); + log.info("----------------<<<<<<"); + System.out.println("\r"); log.info("解析成员变量名称及其数据类型键值对列表完毕,变量列表如下"); log.info("---------------->>>>>>"); - log.info("{}", fieldMapList); + log.info("javaMapList = {}", javaMapList); + log.info("javaMapList = {}", javaMapList); log.info("----------------<<<<<<"); + System.out.println("\r"); //判断是否生成DTO - if(optionalFileType.contains(FileTypeEnum.DTO.name())) { - dtoGenerator.setResourceMapList(fieldMapList); + if(propertyUtil.getOptionalFileType().contains(FileTypeEnum.DTO.name())) { + dtoGenerator.setResourceMapList(javaMapList); Thread thread = new Thread(dtoGenerator); log.info("生成 {} 线程启动...", FileTypeEnum.DTO.name()); thread.start(); } //判断是否生成PO - if(optionalFileType.contains(FileTypeEnum.PO.name())) { - poGenerator.setResourceMapList(fieldMapList); + if(propertyUtil.getOptionalFileType().contains(FileTypeEnum.PO.name())) { + poGenerator.setResourceMapList(javaMapList); Thread thread = new Thread(poGenerator); log.info("生成 {} 线程启动...", FileTypeEnum.PO.name()); thread.start(); } //判断是否生成Mapper - if(optionalFileType.contains(FileTypeEnum.Mapper.name())) { + if(propertyUtil.getOptionalFileType().contains(FileTypeEnum.Mapper.name())) { Thread thread = new Thread(mapperGenerator); log.info("生成 {} 线程启动...", FileTypeEnum.Mapper.name()); thread.start(); } - }catch(FileNotFoundException e) { - log.error("文件 {} 不存在", fileAbsolutePath); + } catch(FileNotFoundException e) { + log.error("文件 {} 不存在", propertyUtil.getSourceFileAbsolutePath()); log.error("请确认文件路径后重试,程序终止"); System.exit(-1); - }catch(IOException e) { + } catch(IOException e) { log.error(e.getMessage(), e); System.exit(-1); } diff --git a/src/main/java/org/bravof/analysis/ProgramStarter.java b/src/main/java/org/bravof/analysis/ProgramStarter.java index 52d2d796d7321100fe0b394ef6d4fdb6b3d59542..4bfc72544cc5e65ae363aefb88b6d8b0c6fa581c 100644 --- a/src/main/java/org/bravof/analysis/ProgramStarter.java +++ b/src/main/java/org/bravof/analysis/ProgramStarter.java @@ -1,6 +1,5 @@ package org.bravof.analysis; -import org.bravof.analysis.DataProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; diff --git a/src/main/java/org/bravof/common/CaseUtils.java b/src/main/java/org/bravof/common/CaseUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..ef49d1a8931725451a294c0806440b62f85f7fad --- /dev/null +++ b/src/main/java/org/bravof/common/CaseUtils.java @@ -0,0 +1,28 @@ +package org.bravof.common; + +import com.google.common.base.CaseFormat; +import org.springframework.stereotype.Component; + +/** + * 字符串风格处理工具 + */ +@Component +public class CaseUtils { + /** + * snake 风格字符串转 camel , 首字母小写 + * @param string + * @return + */ + public String snakeToLowerCamel(String string) { + return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, string); + } + + /** + * snake 风格字符串转 camel , 首字母大写 + * @param string + * @return + */ + public String snakeToUpperCame(String string) { + return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, string); + } +} diff --git a/src/main/java/org/bravof/common/Constants.java b/src/main/java/org/bravof/common/Constants.java index d762b0d420a06e9b1b65bbc5be47c64c522e1cf1..88945e6a039d1ada3447eb007c12d615e80b3136 100644 --- a/src/main/java/org/bravof/common/Constants.java +++ b/src/main/java/org/bravof/common/Constants.java @@ -1,9 +1,27 @@ package org.bravof.common; +import java.util.HashMap; +import java.util.Map; + /** * 常量类 */ public class Constants { + /** + * 数据库字段类型对应的Java数据类型映射 + */ + public static final Map mySQLTypeMap; + + static { + mySQLTypeMap = new HashMap<>(); + mySQLTypeMap.put("char", "String"); + mySQLTypeMap.put("varchar", "String"); + mySQLTypeMap.put("decimal", "BigDecimal"); + mySQLTypeMap.put("datetime", "Date"); + mySQLTypeMap.put("timestamp", "Date"); + mySQLTypeMap.put("int", "Integer"); + } + /** * 下划线 */ @@ -33,9 +51,11 @@ public class Constants { public static final String PRIVATE = "private"; public static final String CLASS = "class"; public static final String STRING = "String"; + public static final String VARCHAR = "VARCHAR"; public static final String JAVA = "java"; + public static final String SPACE = " "; public static final String NEW_LINE = "\n"; @@ -45,4 +65,6 @@ public class Constants { public static final String BRACKETS_SMALL_L = "("; public static final String BRACKETS_SMALL_R = ")"; + + } diff --git a/src/main/java/org/bravof/common/PropertyUtil.java b/src/main/java/org/bravof/common/PropertyUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..8e6c0110af4b0c44cd241105340cc527cb451c43 --- /dev/null +++ b/src/main/java/org/bravof/common/PropertyUtil.java @@ -0,0 +1,62 @@ +package org.bravof.common; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 配置文件配置值获取工具 + */ +@Component +@Getter +@NoArgsConstructor +public class PropertyUtil { + /** + * 源数据文件绝对路径 + */ + @Value("${file_absolute_path}") + private String sourceFileAbsolutePath; + + /** + * 需要生成的文件类型 + */ + @Value("${optional_file_type}") + private String optionalFileType; + + /** + * 包名前缀 + */ + @Value("${package_name_prefix}") + private String packNamePrefix; + + /** + * 输出文件的所在目录(绝对路径) + */ + @Value("${output_folder_path}") + private String outPutFilePath; + + /** + * class名称,不包含后缀 + */ + @Value("${class_name}") + private String className; + + /** + * DTO和PO的所需导入包的全路径列表,分号分割 + */ + @Value("${dto_or_po_import_list}") + private String importListStr; + + /** + * DTO和PO的所需添加的注解列表,分号分割 + */ + @Value("${dto_or_po_annotation_list}") + private String annotationListStr; + + /** + * DTO和PO所需实现的接口列表,分号分割 + */ + @Value("${dto_or_po_implement_list}") + private String implementListStr; +} diff --git a/src/main/java/org/bravof/generate/DTOGenerator.java b/src/main/java/org/bravof/generate/DTOGenerator.java index 198ddcbfcaa9cc9e91cf6c543ac1003a4525fd19..942a85fd4c975a46b76940b2e4b19f46be910ede 100644 --- a/src/main/java/org/bravof/generate/DTOGenerator.java +++ b/src/main/java/org/bravof/generate/DTOGenerator.java @@ -1,13 +1,14 @@ package org.bravof.generate; -import com.google.common.base.CaseFormat; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; +import org.bravof.common.CaseUtils; import org.bravof.common.Constants; import org.bravof.common.FileTypeEnum; -import org.springframework.beans.factory.annotation.Value; +import org.bravof.common.PropertyUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; @@ -23,23 +24,13 @@ import java.util.Map; @Setter @NoArgsConstructor public class DTOGenerator implements Runnable { - @Value("${package_name_prefix}") - private String packNamePrefix; + @Autowired + private PropertyUtil propertyUtil; - @Value("${output_folder_path}") - private String outPutFilePath; + @Autowired + private CaseUtils caseUtils; - @Value("${class_name}") - private String className; - - @Value("${dto_or_po_import_list}") - private String importListStr; - - @Value("${dto_or_po_annotation_list}") - private String annotationListStr; - - @Value("${dto_or_po_implement_list}") - private String implementListStr; + private File file; /** * 用以生成代码的源数据 @@ -55,9 +46,9 @@ public class DTOGenerator implements Runnable { //生成包名 buffer.append(Constants.PACKAGE); buffer.append(Constants.SPACE); - buffer.append(packNamePrefix); + buffer.append(propertyUtil.getPackNamePrefix()); buffer.append(Constants.DOT); - buffer.append(className.toLowerCase()); + buffer.append(propertyUtil.getClassName().toLowerCase()); buffer.append(Constants.DOT); buffer.append(FileTypeEnum.DTO.name().toLowerCase()); buffer.append(Constants.SEMICOLON); @@ -67,7 +58,7 @@ public class DTOGenerator implements Runnable { buffer.append(Constants.NEW_LINE); //生成需要导入的包 - List importList = Arrays.asList(importListStr.split(Constants.SEMICOLON)); + List importList = Arrays.asList(propertyUtil.getImportListStr().split(Constants.SEMICOLON)); for(String each : importList) { buffer.append(Constants.IMPORT + Constants.SPACE); buffer.append(each + Constants.SEMICOLON); @@ -78,21 +69,21 @@ public class DTOGenerator implements Runnable { buffer.append(Constants.NEW_LINE); //生成类注解 - List annotationList = Arrays.asList(annotationListStr.split(Constants.SEMICOLON)); + List annotationList = Arrays.asList(propertyUtil.getAnnotationListStr().split(Constants.SEMICOLON)); for(String each : annotationList) { buffer.append(each + Constants.NEW_LINE); } //生成类主体 buffer.append(Constants.PUBLIC + Constants.SPACE + Constants.CLASS + Constants.SPACE); - String realClassName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, className.toLowerCase()); + String realClassName = caseUtils.snakeToUpperCame(propertyUtil.getClassName().toLowerCase()); buffer.append(realClassName + FileTypeEnum.DTO.name().toUpperCase() + Constants.SPACE); //生成实现接口 - if(!StringUtils.isEmpty(implementListStr)) { + if(!StringUtils.isEmpty(propertyUtil.getImplementListStr())) { buffer.append(Constants.IMPLEMENTS + Constants.SPACE); //实现接口的字符串 - String listOfInterface = StringUtils.join(implementListStr.split(Constants.SEMICOLON)); + String listOfInterface = StringUtils.join(propertyUtil.getImplementListStr().split(Constants.SEMICOLON)); buffer.append(listOfInterface + Constants.SPACE); } buffer.append(Constants.BRACKETS_BIG_L); @@ -108,7 +99,7 @@ public class DTOGenerator implements Runnable { while(nextIterator.hasNext()) { Map.Entry fieldAndTyle = nextIterator.next(); buffer.append(Constants.PRIVATE + Constants.SPACE); - buffer.append(fieldAndTyle.getValue() + Constants.SPACE + CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, fieldAndTyle.getKey()) + Constants.SEMICOLON); + buffer.append(fieldAndTyle.getValue() + Constants.SPACE + caseUtils.snakeToLowerCamel(fieldAndTyle.getKey()) + Constants.SEMICOLON); buffer.append(Constants.NEW_LINE); } @@ -116,23 +107,23 @@ public class DTOGenerator implements Runnable { buffer.append(Constants.BRACKETS_BIG_R); //输出到文件 - File folder = new File(outPutFilePath); - File file; + File folder = new File(propertyUtil.getOutPutFilePath()); + FileWriter fileWriter = null; try { //判断是否存在输出目录,不存在则创建 if(!folder.exists()) { folder.mkdirs(); } - file = new File(outPutFilePath + Constants.SLASH + realClassName + FileTypeEnum.DTO.name().toUpperCase() + Constants.DOT + Constants.JAVA); + file = new File(propertyUtil.getOutPutFilePath() + Constants.SLASH + realClassName + FileTypeEnum.DTO.name().toUpperCase() + Constants.DOT + Constants.JAVA); if(!file.exists()) { file.createNewFile(); } fileWriter = new FileWriter(file); fileWriter.write(buffer.toString()); - }catch(IOException e) { + } catch(IOException e) { log.error(e.getMessage(), e); - }finally { + } finally { if(fileWriter != null) { fileWriter.close(); } @@ -145,9 +136,9 @@ public class DTOGenerator implements Runnable { long start = System.currentTimeMillis(); execute(); long end = System.currentTimeMillis(); - log.info("生成 {} 结束,耗时 {} ms", FileTypeEnum.DTO.name(), end - start); + log.info("生成 {} 结束,耗时 {} ms, 文件位置 -> {}", FileTypeEnum.DTO.name(), end - start, file.getAbsolutePath()); - }catch(IOException e) { + } catch(IOException e) { log.error(e.getMessage(), e); } } diff --git a/src/main/java/org/bravof/generate/POGenerator.java b/src/main/java/org/bravof/generate/POGenerator.java index cb0eb480abc0f9e13149d7e652f972d5fcd70322..a25e1089df62e4b6a5a7fe9583504b425f0a5c80 100644 --- a/src/main/java/org/bravof/generate/POGenerator.java +++ b/src/main/java/org/bravof/generate/POGenerator.java @@ -1,13 +1,14 @@ package org.bravof.generate; -import com.google.common.base.CaseFormat; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.StringUtils; +import org.bravof.common.CaseUtils; import org.bravof.common.Constants; import org.bravof.common.FileTypeEnum; -import org.springframework.beans.factory.annotation.Value; +import org.bravof.common.PropertyUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; @@ -23,23 +24,13 @@ import java.util.Map; @Setter @NoArgsConstructor public class POGenerator implements Runnable { - @Value("${package_name_prefix}") - private String packNamePrefix; + @Autowired + private PropertyUtil propertyUtil; - @Value("${output_folder_path}") - private String outPutFilePath; + @Autowired + private CaseUtils caseUtils; - @Value("${class_name}") - private String className; - - @Value("${dto_or_po_import_list}") - private String importListStr; - - @Value("${dto_or_po_annotation_list}") - private String annotationListStr; - - @Value("${dto_or_po_implement_list}") - private String implementListStr; + private File file; /** * 用以生成代码的源数据 @@ -55,9 +46,9 @@ public class POGenerator implements Runnable { //生成包名 buffer.append(Constants.PACKAGE); buffer.append(Constants.SPACE); - buffer.append(packNamePrefix); + buffer.append(propertyUtil.getPackNamePrefix()); buffer.append(Constants.DOT); - buffer.append(className.toLowerCase()); + buffer.append(propertyUtil.getClassName().toLowerCase()); buffer.append(Constants.DOT); buffer.append(FileTypeEnum.PO.name().toLowerCase()); buffer.append(Constants.SEMICOLON); @@ -67,7 +58,7 @@ public class POGenerator implements Runnable { buffer.append(Constants.NEW_LINE); //生成需要导入的包 - List importList = Arrays.asList(importListStr.split(Constants.SEMICOLON)); + List importList = Arrays.asList(propertyUtil.getImportListStr().split(Constants.SEMICOLON)); for(String each : importList) { buffer.append(Constants.IMPORT + Constants.SPACE); buffer.append(each + Constants.SEMICOLON); @@ -78,21 +69,21 @@ public class POGenerator implements Runnable { buffer.append(Constants.NEW_LINE); //生成类注解 - List annotationList = Arrays.asList(annotationListStr.split(Constants.SEMICOLON)); + List annotationList = Arrays.asList(propertyUtil.getAnnotationListStr().split(Constants.SEMICOLON)); for(String each : annotationList) { buffer.append(each + Constants.NEW_LINE); } //生成类主体 buffer.append(Constants.PUBLIC + Constants.SPACE + Constants.CLASS + Constants.SPACE); - String realClassName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, className.toLowerCase()); + String realClassName = caseUtils.snakeToUpperCame(propertyUtil.getClassName().toLowerCase()); buffer.append(realClassName + FileTypeEnum.PO.name().toUpperCase() + Constants.SPACE); //生成实现接口 - if(!StringUtils.isEmpty(implementListStr)) { + if(!StringUtils.isEmpty(propertyUtil.getImplementListStr())) { buffer.append(Constants.IMPLEMENTS + Constants.SPACE); //实现接口的字符串 - String listOfInterface = StringUtils.join(implementListStr.split(Constants.SEMICOLON)); + String listOfInterface = StringUtils.join(propertyUtil.getImplementListStr().split(Constants.SEMICOLON)); buffer.append(listOfInterface + Constants.SPACE); } buffer.append(Constants.BRACKETS_BIG_L); @@ -108,7 +99,7 @@ public class POGenerator implements Runnable { while(nextIterator.hasNext()) { Map.Entry fieldAndTyle = nextIterator.next(); buffer.append(Constants.PRIVATE + Constants.SPACE); - buffer.append(fieldAndTyle.getValue() + Constants.SPACE + CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, fieldAndTyle.getKey()) + Constants.SEMICOLON); + buffer.append(fieldAndTyle.getValue() + Constants.SPACE + caseUtils.snakeToLowerCamel(fieldAndTyle.getKey()) + Constants.SEMICOLON); buffer.append(Constants.NEW_LINE); } @@ -116,23 +107,23 @@ public class POGenerator implements Runnable { buffer.append(Constants.BRACKETS_BIG_R); //输出到文件 - File folder = new File(outPutFilePath); - File file; + File folder = new File(propertyUtil.getOutPutFilePath()); + FileWriter fileWriter = null; try { //判断是否存在输出目录,不存在则创建 if(!folder.exists()) { folder.mkdirs(); } - file = new File(outPutFilePath + Constants.SLASH + realClassName + FileTypeEnum.PO.name().toUpperCase() + Constants.DOT + Constants.JAVA); + file = new File(propertyUtil.getOutPutFilePath() + Constants.SLASH + realClassName + FileTypeEnum.PO.name().toUpperCase() + Constants.DOT + Constants.JAVA); if(!file.exists()) { file.createNewFile(); } fileWriter = new FileWriter(file); fileWriter.write(buffer.toString()); - }catch(IOException e) { + } catch(IOException e) { log.error(e.getMessage(), e); - }finally { + } finally { if(fileWriter != null) { fileWriter.close(); } @@ -145,9 +136,9 @@ public class POGenerator implements Runnable { long start = System.currentTimeMillis(); execute(); long end = System.currentTimeMillis(); - log.info("生成 {} 结束,耗时 {} ms", FileTypeEnum.PO.name(), end - start); + log.info("生成 {} 结束,耗时 {} ms, 文件位置 -> {}", FileTypeEnum.DTO.name(), end - start, file.getAbsolutePath()); - }catch(IOException e) { + } catch(IOException e) { log.error(e.getMessage(), e); } }