From 4bde36ece96b6d9a0130df727334e8416d3f4f3a Mon Sep 17 00:00:00 2001 From: aoyu <1790306716@qq.com> Date: Wed, 28 Dec 2022 17:27:15 +0800 Subject: [PATCH] =?UTF-8?q?feat[storage]=20resource=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=8C=87=E5=AE=9A=E8=B7=AF=E5=BE=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zfoo/storage/interpreter/CsvReader.java | 10 +++---- .../zfoo/storage/interpreter/ExcelReader.java | 8 +++--- .../interpreter/ResourceInterpreter.java | 12 ++++----- .../zfoo/storage/manager/StorageManager.java | 26 ++++++++++++++++++- .../com/zfoo/storage/model/anno/Resource.java | 11 +++++++- .../com/zfoo/storage/ApplicationTest.java | 2 +- .../storage/resource/StudentCsvResource.java | 2 +- 7 files changed, 52 insertions(+), 19 deletions(-) diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/CsvReader.java b/storage/src/main/java/com/zfoo/storage/interpreter/CsvReader.java index 6a6004f8..60dedf9a 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/CsvReader.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/CsvReader.java @@ -61,12 +61,12 @@ public abstract class CsvReader { // 获取配置表的有效列名称,默认第一行就是字段名称 var fieldRow = iterator.next(); if (fieldRow == null) { - throw new RunException("无法获取资源[class:{}]的csv文件的属性控制列", fileName); + throw new RunException("Failed to get attribute control column from csv file of resource [class:{}]", fileName); } //默认第二行字段类型 var typeRow = iterator.next(); if (typeRow == null) { - throw new RunException("无法获取资源[class:{}]的csv文件的类型控制列", fileName); + throw new RunException("Failed to get type control column from csv file of resource [class:{}]", fileName); } // 默认第三行为描述,需要的时候再使用 var descRow = iterator.next(); @@ -75,11 +75,11 @@ public abstract class CsvReader { for (var i = 0; i < fieldRow.size(); i++) { var fieldName = fieldRow.get(i); if (fieldName == null) { - throw new RunException("{}列名不能为空,第{}列没有配置名字", fileName, i + 1); + throw new RunException("The column name of {} cannot be empty, and column {} has no configured name", fileName, i + 1); } var filedType = typeRow.get(i); if (filedType == null) { - throw new RunException("{}列类型不能为空,第{}列没有配置类型", fileName, i + 1); + throw new RunException("The column type of {} cannot be empty, and column {} has no configured type", fileName, i + 1); } headers.add(ResourceHeader.valueOf(fieldName, filedType, i)); } @@ -90,7 +90,7 @@ public abstract class CsvReader { try { return CSVFormat.EXCEL.parse(new InputStreamReader(input)); } catch (IOException e) { - throw new RunException("静态资源[{}]异常,无法读取文件", fileName); + throw new RunException("Static resource [{}] is abnormal, and the file cannot be read", fileName); } } } diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/ExcelReader.java b/storage/src/main/java/com/zfoo/storage/interpreter/ExcelReader.java index e506bed0..07c3cedf 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ExcelReader.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ExcelReader.java @@ -64,12 +64,12 @@ public abstract class ExcelReader { // 获取配置表的有效列名称,默认第一行就是字段名称 var fieldRow = iterator.next(); if (fieldRow == null) { - throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", fileName); + throw new RunException("Failed to get attribute control column from excel file of resource [class:{}]", fileName); } // 默认第二行字段类型 var typeRow = iterator.next(); if (typeRow == null) { - throw new RunException("无法获取资源[class:{}]的Excel文件的类型控制列", fileName); + throw new RunException("Failed to get type control column from excel file of resource [class:{}]", fileName); } // 默认第三行为描述,需要的时候再使用 var desRow = iterator.next(); @@ -94,7 +94,7 @@ public abstract class ExcelReader { } var previousValue = cellFieldMap.put(fieldName, i); if (Objects.nonNull(previousValue)) { - throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", fileName, fieldName); + throw new RunException("There are duplicate attribute control columns [field:{}] in the Excel file of the resource [class:{}]", fieldName,fileName); } headerList.add(ResourceHeader.valueOf(fieldName, typeName, i)); } @@ -105,7 +105,7 @@ public abstract class ExcelReader { try { return WorkbookFactory.create(input); } catch (IOException e) { - throw new RunException("静态资源[{}]异常,无法读取文件", fileName); + throw new RunException("Static resource [{}] is abnormal, and the file cannot be read", fileName); } } diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java index a5f1190d..05da2e4d 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java @@ -61,7 +61,7 @@ public class ResourceInterpreter { } else if (resourceEnum == ResourceEnum.CSV) { resource = CsvReader.readResourceDataFromCSV(inputStream, clazz.getSimpleName()); } else { - throw new RunException("不支持文件[{}]的配置类型[{}]", clazz.getSimpleName(), suffix); + throw new RunException("Configuration type [{}] of file [{}] is not supported", suffix, clazz.getSimpleName()); } var result = new ArrayList(); @@ -93,7 +93,7 @@ public class ResourceInterpreter { ReflectionUtils.makeAccessible(field); ReflectionUtils.setField(field, instance, value); } catch (Exception e) { - throw new RunException(e, "无法将Excel资源[class:{}]中的[content:{}]转换为属性[field:{}]", instance.getClass().getSimpleName(), content, field.getName()); + throw new RunException(e, "Unable to convert [content:{}] to property [field:{}] in Excel resource [class:{}]", content, field.getName(), instance.getClass().getSimpleName()); } } @@ -102,13 +102,13 @@ public class ResourceInterpreter { var fieldList = ReflectionUtils.notStaticAndTransientFields(clazz); for (var field : fieldList) { if (!fieldMap.containsKey(field.getName())) { - throw new RunException("资源类[class:{}]的声明属性[filed:{}]无法获取,请检查配置表的格式", clazz, field.getName()); + throw new RunException("The declaration attribute [filed:{}] of the resource class [class:{}] cannot be obtained, please check the format of the configuration table", field.getName(), clazz); } if (field.isAnnotationPresent(Id.class)) { var cellIndex = fieldMap.get(field.getName()); if (cellIndex != 0) { - throw new RunException("资源类[class:{}]的主键[Id:{}]必须放在Excel配置表的第一列,请检查配置表的格式", clazz, field.getName()); + throw new RunException("The primary key [Id:{}] of the resource class [class:{}] must be placed in the first column of the Excel configuration table, please check the format of the configuration table", field.getName(), clazz); } } } @@ -128,7 +128,7 @@ public class ResourceInterpreter { public static Map getFieldMap(ResourceData resource, Class clazz) { var header = resource.getHeaders(); if (header == null) { - throw new RunException("无法获取资源[class:{}]的Excel文件的属性控制列", clazz.getSimpleName()); + throw new RunException("Failed to get attribute control column from excel file of resource [class:{}]", clazz.getSimpleName()); } var cellFieldMap = new HashMap(); @@ -144,7 +144,7 @@ public class ResourceInterpreter { } var previousValue = cellFieldMap.put(name, i); if (Objects.nonNull(previousValue)) { - throw new RunException("资源[class:{}]的Excel文件出现重复的属性控制列[field:{}]", clazz.getSimpleName(), name); + throw new RunException("There are duplicate attribute control columns [field:{}] in the Excel file of the resource [class:{}]", name, clazz.getSimpleName()); } } return cellFieldMap; diff --git a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java index be87e94c..6ac5134a 100644 --- a/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java +++ b/storage/src/main/java/com/zfoo/storage/manager/StorageManager.java @@ -90,7 +90,7 @@ public class StorageManager implements IStorageManager { throw new RuntimeException(StringUtils.format("Unable to get resource [class:{}]", clazzName)); } - var resourceFile = scanResourceFile(resourceClazz); + var resourceFile = getResourceFile(resourceClazz); ResourceDef resourceDef = new ResourceDef(resourceClazz, resourceFile); if (resourceDefinitionMap.containsKey(resourceClazz)) { // 类的资源定义已经存在 @@ -290,4 +290,28 @@ public class StorageManager implements IStorageManager { throw new RuntimeException(ExceptionUtils.getMessage(e)); } } + private Resource getResourceFileByPath(Class clazz){ + var resourcePatternResolver = new PathMatchingResourcePatternResolver(); + var metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); + var path=clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value(); + if(path.equals("")){ + path=clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).path(); + } + var resource= resourcePatternResolver.getResource(path); + try { + var input=resource.getInputStream(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return resource; + } + private Resource getResourceFile(Class clazz){ + if(clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).value().equals("")&& + clazz.getAnnotation(com.zfoo.storage.model.anno.Resource.class).path().equals("")){ + return scanResourceFile(clazz); + } + else{ + return getResourceFileByPath(clazz); + } + } } diff --git a/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java b/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java index 595b9349..b614869a 100644 --- a/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java +++ b/storage/src/main/java/com/zfoo/storage/model/anno/Resource.java @@ -13,11 +13,14 @@ package com.zfoo.storage.model.anno; +import org.springframework.core.annotation.AliasFor; + import java.lang.annotation.*; /** * 资源注解 - * + * 可以指定对应的资源路径,如果是类路径一classpath开头,如果是其它目录则以file开头 + * 如果不指定路径,则默认通过扫描路径获取与类名相同的文件资源 * @author godotg * @version 4.0 */ @@ -25,4 +28,10 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface Resource { + @AliasFor("path") + String value() default ""; + + + @AliasFor("value") + String path() default ""; } diff --git a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java index df7f6251..9fa30a80 100644 --- a/storage/src/test/java/com/zfoo/storage/ApplicationTest.java +++ b/storage/src/test/java/com/zfoo/storage/ApplicationTest.java @@ -49,7 +49,7 @@ public class ApplicationTest { var studentManager = context.getBean(StudentManager.class); var studentResources = studentManager.studentResources; var studentCsvResources = studentManager.studentCsvResources; - // 类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 + // @Resource注解没指定路径,类名称和Excel名称必须完全一致,Excel的列名称必须对应对象的属性名称 for (StudentResource resource : studentResources.getAll()) { logger.info(JsonUtils.object2String(resource)); } diff --git a/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java b/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java index eac5d698..895be657 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/StudentCsvResource.java @@ -21,7 +21,7 @@ import com.zfoo.storage.model.anno.Resource; * @author godotg * @version 4.0 */ -@Resource +@Resource(path="classpath:/excel/StudentCsvResource.csv") public class StudentCsvResource { @Id