diff --git a/example/pom.xml b/example/pom.xml
index 0ea7b01..75ed9d8 100644
--- a/example/pom.xml
+++ b/example/pom.xml
@@ -18,7 +18,7 @@
UTF-8
1.5.1.Final
- 1.1.4
+ 1.1.5
1.18.22
diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Goods.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Goods.java
index 52e94b4..8b77e8d 100644
--- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Goods.java
+++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Goods.java
@@ -1,12 +1,19 @@
package io.github.linpeilie.model;
+import io.github.linpeilie.annotations.AutoMapper;
+import io.github.linpeilie.annotations.AutoMapping;
+import io.github.linpeilie.annotations.AutoMappings;
import lombok.Data;
@Data
+@AutoMapper(target = GoodsVo.class, reverseConvertGenerate = true)
public class Goods {
private String price;
private String takeDownTime;
+ @AutoMapping(target = "price", source = "sku.price")
+ private Sku sku;
+
}
diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/GoodsVo.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/GoodsVo.java
new file mode 100644
index 0000000..848198c
--- /dev/null
+++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/GoodsVo.java
@@ -0,0 +1,10 @@
+package io.github.linpeilie.model;
+
+import lombok.Data;
+
+@Data
+public class GoodsVo {
+
+ private Integer price;
+
+}
diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Sku.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Sku.java
new file mode 100644
index 0000000..1dd30ce
--- /dev/null
+++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/Sku.java
@@ -0,0 +1,10 @@
+package io.github.linpeilie.model;
+
+import lombok.Data;
+
+@Data
+public class Sku {
+
+ private Integer price;
+
+}
diff --git a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/SysMenu.java b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/SysMenu.java
index 308199a..3e7d0a3 100644
--- a/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/SysMenu.java
+++ b/example/spring-boot-with-lombok/src/main/java/io/github/linpeilie/model/SysMenu.java
@@ -1,6 +1,7 @@
package io.github.linpeilie.model;
import io.github.linpeilie.annotations.AutoMapper;
+import io.github.linpeilie.annotations.AutoMapping;
import java.util.List;
import lombok.Data;
@@ -8,6 +9,7 @@ import lombok.Data;
@Data
public class SysMenu {
+ @AutoMapping(target = "path", defaultValue = "/")
private String path;
private List children;
diff --git a/example/spring-boot-with-lombok/src/test/java/io/github/linpeilie/QuickStartTest.java b/example/spring-boot-with-lombok/src/test/java/io/github/linpeilie/QuickStartTest.java
index cea3859..ddb2ec7 100644
--- a/example/spring-boot-with-lombok/src/test/java/io/github/linpeilie/QuickStartTest.java
+++ b/example/spring-boot-with-lombok/src/test/java/io/github/linpeilie/QuickStartTest.java
@@ -3,13 +3,18 @@ package io.github.linpeilie;
import cn.hutool.core.date.DateUtil;
import io.github.linpeilie.model.Goods;
import io.github.linpeilie.model.GoodsDto;
+import io.github.linpeilie.model.GoodsVo;
import io.github.linpeilie.model.MapModelA;
+import io.github.linpeilie.model.Sku;
+import io.github.linpeilie.model.SysMenu;
+import io.github.linpeilie.model.SysMenuVo;
import io.github.linpeilie.model.User;
import io.github.linpeilie.model.UserDto;
import io.github.linpeilie.model.UserVO;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -135,4 +140,31 @@ public class QuickStartTest {
assert userDto.getMoney().equals("$12543.12");
}
+ @Test
+ public void treeTest() {
+ SysMenu sysMenu = new SysMenu();
+ sysMenu.setPath("/api");
+
+ final SysMenu role = new SysMenu();
+ role.setPath("/role");
+
+ final SysMenu user = new SysMenu();
+
+ sysMenu.setChildren(Arrays.asList(role, user));
+
+ final SysMenuVo sysMenuVo = converter.convert(sysMenu, SysMenuVo.class);
+ System.out.println(sysMenuVo);
+ }
+
+ @Test
+ public void sourceTest() {
+ Goods goods = new Goods();
+ Sku sku = new Sku();
+ sku.setPrice(134);
+ goods.setSku(sku);
+
+ final GoodsVo goodsVo = converter.convert(goods, GoodsVo.class);
+ System.out.println(goodsVo);
+ }
+
}
diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java
index 88fd1f9..4ec6af9 100644
--- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java
+++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/AutoMapperProcessor.java
@@ -378,9 +378,14 @@ public class AutoMapperProcessor extends AbstractProcessor {
}
AutoMappingMetadata metadata = new AutoMappingMetadata();
+ if (autoMapping.source() != null && !autoMapping.source().isEmpty()) {
+ metadata.setSource(autoMapping.source());
+ } else {
+ metadata.setSource(ele.getSimpleName().toString());
+ }
metadata.setTargetClass(targetClass);
metadata.setTarget(autoMapping.target());
- metadata.setSource(ele.getSimpleName().toString());
+ metadata.setDefaultValue(autoMapping.defaultValue());
metadata.setIgnore(autoMapping.ignore());
metadata.setExpression(autoMapping.expression());
metadata.setDateFormat(autoMapping.dateFormat());
diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java
index afb1c66..747632d 100644
--- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java
+++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/generator/AutoMapperGenerator.java
@@ -1,5 +1,6 @@
package io.github.linpeilie.processor.generator;
+import cn.hutool.core.util.StrUtil;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
@@ -73,10 +74,16 @@ public class AutoMapperGenerator {
return autoMappingMetadataList.stream().map(autoMappingMetadata -> {
final AnnotationSpec.Builder builder = AnnotationSpec.builder(ClassName.get("org.mapstruct", "Mapping"))
.addMember("target", CodeBlock.builder().add("$S", autoMappingMetadata.getTarget()).build())
-
- .addMember("dateFormat", CodeBlock.builder().add("$S", autoMappingMetadata.getDateFormat()).build())
- .addMember("numberFormat", CodeBlock.builder().add("$S", autoMappingMetadata.getNumberFormat()).build())
.addMember("ignore", CodeBlock.builder().add(String.valueOf(autoMappingMetadata.isIgnore())).build());
+ if (StrUtil.isNotEmpty(autoMappingMetadata.getDateFormat())) {
+ builder.addMember("dateFormat", CodeBlock.builder().add("$S", autoMappingMetadata.getDateFormat()).build());
+ }
+ if (StrUtil.isNotEmpty(autoMappingMetadata.getNumberFormat())) {
+ builder.addMember("numberFormat", CodeBlock.builder().add("$S", autoMappingMetadata.getNumberFormat()).build());
+ }
+ if (StrUtil.isNotEmpty(autoMappingMetadata.getDefaultValue())) {
+ builder.addMember("defaultValue", CodeBlock.builder().add("$S", autoMappingMetadata.getDefaultValue()).build());
+ }
if (StringUtils.isNoneEmpty(autoMappingMetadata.getExpression())) {
builder.addMember("expression",
CodeBlock.builder().add("$S", autoMappingMetadata.getExpression()).build());
diff --git a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMappingMetadata.java b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMappingMetadata.java
index bef107a..b7e49d0 100644
--- a/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMappingMetadata.java
+++ b/mapstruct-plus-processor/src/main/java/io/github/linpeilie/processor/metadata/AutoMappingMetadata.java
@@ -18,6 +18,8 @@ public class AutoMappingMetadata {
private boolean ignore = false;
+ private String defaultValue = "";
+
public ClassName getTargetClass() {
return targetClass;
}
@@ -73,4 +75,12 @@ public class AutoMappingMetadata {
public void setIgnore(final boolean ignore) {
this.ignore = ignore;
}
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(final String defaultValue) {
+ this.defaultValue = defaultValue;
+ }
}
diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java
index e7991bc..c300546 100644
--- a/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java
+++ b/mapstruct-plus/src/main/java/io/github/linpeilie/BaseMapper.java
@@ -1,5 +1,7 @@
package io.github.linpeilie;
+import cn.hutool.core.collection.CollectionUtil;
+import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.mapstruct.MappingTarget;
@@ -11,6 +13,9 @@ public interface BaseMapper {
T convert(S source, @MappingTarget T target);
default List convert(List sourceList) {
+ if (CollectionUtil.isEmpty(sourceList)) {
+ return Collections.emptyList();
+ }
return sourceList.stream().map(this::convert).collect(Collectors.toList());
}
diff --git a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java
index 512fd47..936c2cd 100644
--- a/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java
+++ b/mapstruct-plus/src/main/java/io/github/linpeilie/annotations/AutoMapping.java
@@ -12,6 +12,13 @@ public @interface AutoMapping {
Class> targetClass() default DefaultMapping.class;
+ /**
+ * 来源,默认取当前字段名称
+ * - 可以是当前类中的属性名
+ * - 也可以是属性名.属性名,例如:address.city.name
+ */
+ String source() default "";
+
String target();
String dateFormat() default "";
@@ -22,4 +29,9 @@ public @interface AutoMapping {
boolean ignore() default false;
+ /**
+ * 默认值
+ */
+ String defaultValue() default "";
+
}
diff --git a/pom.xml b/pom.xml
index d03bc1d..6fef724 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,7 +17,7 @@
- 1.1.4
+ 1.1.5
8
8
UTF-8