From 59cb185ff08941e8213c4d7f646d4e653cb706ff Mon Sep 17 00:00:00 2001 From: xgc Date: Thu, 6 Jun 2024 12:31:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=92=E5=85=A5=E5=BC=8F?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3@GenerateMilvusMapper=EF=BC=8C=E7=BB=99?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=20Mapper=E5=92=8C=E5=B1=9E=E6=80=A7?= =?UTF-8?q?Constants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- milvus-plus-boot-starter/pom.xml | 12 ++ .../plus/annotation/GenerateMilvusMapper.java | 12 ++ .../GenerateMilvusMapperProcessor.java | 106 ++++++++++++++++++ milvus-plus-parent/pom.xml | 2 + 4 files changed, 132 insertions(+) create mode 100644 milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/annotation/GenerateMilvusMapper.java create mode 100644 milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/processor/GenerateMilvusMapperProcessor.java diff --git a/milvus-plus-boot-starter/pom.xml b/milvus-plus-boot-starter/pom.xml index b907ec6..d27e55f 100644 --- a/milvus-plus-boot-starter/pom.xml +++ b/milvus-plus-boot-starter/pom.xml @@ -30,6 +30,18 @@ ${mica-auto.vaersion} provided + + com.squareup + javapoet + ${javapoet.version} + + + com.google.auto.service + auto-service + ${auto.service.version} + provided + + diff --git a/milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/annotation/GenerateMilvusMapper.java b/milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/annotation/GenerateMilvusMapper.java new file mode 100644 index 0000000..6222c6c --- /dev/null +++ b/milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/annotation/GenerateMilvusMapper.java @@ -0,0 +1,12 @@ +package org.dromara.milvus.plus.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.TYPE) +public @interface GenerateMilvusMapper { + +} \ No newline at end of file diff --git a/milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/processor/GenerateMilvusMapperProcessor.java b/milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/processor/GenerateMilvusMapperProcessor.java new file mode 100644 index 0000000..8288754 --- /dev/null +++ b/milvus-plus-boot-starter/src/main/java/org/dromara/milvus/plus/processor/GenerateMilvusMapperProcessor.java @@ -0,0 +1,106 @@ +package org.dromara.milvus.plus.processor; + +import com.google.auto.service.AutoService; +import com.squareup.javapoet.*; +import org.dromara.milvus.plus.annotation.MilvusField; + +import javax.annotation.processing.*; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import javax.lang.model.util.Elements; +import javax.tools.Diagnostic; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@SupportedAnnotationTypes("org.dromara.milvus.plus.annotation.GenerateMilvusMapper") +@SupportedSourceVersion(SourceVersion.RELEASE_8) +@AutoService(Processor.class) +public class GenerateMilvusMapperProcessor extends AbstractProcessor { + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + for (TypeElement annotation : annotations) { + for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) { + if (element.getKind() == ElementKind.CLASS) { + TypeElement typeElement = (TypeElement) element; + generateMilvusMapperClass(typeElement); + generateConstantsClass(typeElement); + } + } + } + return true; + } + + private void generateMilvusMapperClass(TypeElement typeElement) { + // 获取元素实用工具和类型实用工具 + Elements elementUtils = processingEnv.getElementUtils(); + // 获取实体类的包名和类名 + String packageName = elementUtils.getPackageOf(typeElement).getQualifiedName().toString(); + String className = typeElement.getSimpleName().toString(); + String mapperClassName = className + "MilvusMapper"; + // 创建泛型参数 + TypeName entityTypeName = ClassName.get(packageName, className); + // 创建Mapper类的TypeSpec + TypeSpec mapperClass = TypeSpec.classBuilder(mapperClassName) + .addModifiers(Modifier.PUBLIC) + .superclass(ParameterizedTypeName.get( + ClassName.get("org.dromara.milvus.plus.mapper", "MilvusMapper"), + entityTypeName)) + .addAnnotation(AnnotationSpec.builder(ClassName.get("org.springframework.stereotype", "Component")).build()) + .build(); + + // 创建JavaFile + JavaFile javaFile = JavaFile.builder(packageName, mapperClass) + .addFileComment("Generated by @GenerateMilvusMapper") + .build(); + + try { + // 写入文件 + javaFile.writeTo(processingEnv.getFiler()); + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Error generating Milvus mapper class: " + e.getMessage(), typeElement); + } + } + private void generateConstantsClass(TypeElement typeElement) { + Elements elementUtils = processingEnv.getElementUtils(); + String packageName = elementUtils.getPackageOf(typeElement).getQualifiedName().toString(); + String className = typeElement.getSimpleName().toString(); + String constantsClassName = className + "Constants"; + List constantsFields = new ArrayList<>(); + // 遍历实体类的所有字段 + for (Element enclosedElement : typeElement.getEnclosedElements()) { + if (enclosedElement.getKind() == ElementKind.FIELD) { + VariableElement field = (VariableElement) enclosedElement; + // 检查字段是否有 MilvusField 注解 + MilvusField milvusField = field.getAnnotation(MilvusField.class); + if (milvusField != null) { + String constantName = !milvusField.name().isEmpty() ? milvusField.name() : field.getSimpleName().toString(); + // 确保常量名称是大写的 + String upperCaseConstantName = constantName.toUpperCase(); + constantsFields.add(FieldSpec.builder(String.class, upperCaseConstantName, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) + .initializer("$S", constantName) + .build()); + } + } + } + // 如果有注解字段,则创建 Constants 类 + if (!constantsFields.isEmpty()) { + TypeSpec constantsClass = TypeSpec.classBuilder(constantsClassName) + .addModifiers(Modifier.PUBLIC, Modifier.FINAL) + .addFields(constantsFields) + .build(); + + JavaFile javaFile = JavaFile.builder(packageName, constantsClass) + .addFileComment("Generated by @GenerateMilvusMapperProcessor") + .build(); + + try { + javaFile.writeTo(processingEnv.getFiler()); + } catch (IOException e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Error generating constants class: " + e.getMessage(), typeElement); + } + } + } +} \ No newline at end of file diff --git a/milvus-plus-parent/pom.xml b/milvus-plus-parent/pom.xml index a3383f3..89cf4e2 100644 --- a/milvus-plus-parent/pom.xml +++ b/milvus-plus-parent/pom.xml @@ -42,6 +42,8 @@ 2.7.13 2.3.2 1.8 + 1.13.0 + 1.0 1.6.7