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