后端开发javaMapStruct使用
iamxunMapStruct使用
简介: 背景
在一个成熟可维护的工程中,细分模块后,domian工程最好不要被其他工程依赖,但是实体类一般存于domain之中,这样其他工程想获取实体类数据时就需要在各自工程写model,自定义model可以根据自身业务需要而并不需要映射整个实体属性。
背景
在一个成熟可维护的工程中,细分模块后,domian工程最好不要被其他工程依赖,但是实体类一般存于domain之中,这样其他工程想获取实体类数据时就需要在各自工程写model,自定义model可以根据自身业务需要而并不需要映射整个实体属性。
mapstruct这个插件就是用来处理domin实体类与model类的属性映射,定义mapper接口,mapstruct就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。
如何使用?
1、简单封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| package com.imaxun.demo.framework.common.mapstruct;
import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.Collection; import java.util.List;
import com.imaxun.jarvis.framework.common.util.DateTimeUtils; import org.mapstruct.InheritConfiguration; import org.mapstruct.InheritInverseConfiguration; import org.mapstruct.Mappings;
public interface BasicObjectMapper<S, T> { @Mappings({}) @InheritConfiguration T to(S source);
@InheritConfiguration List<T> to(Collection<S> source);
@InheritInverseConfiguration S from(T source);
@InheritInverseConfiguration List<S> from(Collection<T> source);
default String longToString(Long source) { return source == null ? null : String.valueOf(source); }
default String bigDecimalToString(BigDecimal source) { return source == null ? null : source.toPlainString(); }
default String localDateToString(LocalDate source) { return source == null ? null : DateTimeUtils.dateDefaultFormatter.format(source); }
default String localDateTimeToString(LocalDateTime source) { return source == null ? null : DateTimeUtils.toString(source); }
default Long localDateToLong(LocalDate source) { return null == source ? null : DateTimeUtils.toEpochSecondByDay(source); }
default Long localDateTimeToLong(LocalDateTime source) { return null == source ? null : DateTimeUtils.toEpochSecond(source); }
default LocalDate longToLocalDate(Long source) { if (null == source || source <= 0L) return null; if (source > 10000000000L) { return DateTimeUtils.ofEpochMillisecondToDate(source); } return DateTimeUtils.ofEpochSecondToDate(source); }
default LocalDate stringToLocalDate(String source) { if (source == null) return null; if (source.length() > 10) { LocalDateTime dateTime = LocalDateTime.parse(source, DateTimeUtils.dateTimeDefaultFormatter); return dateTime.toLocalDate(); } return LocalDate.parse(source, DateTimeUtils.dateDefaultFormatter); }
default LocalDateTime longToLocalDateTime(Long source) { if (null == source || source <= 0L) return null; if (source > 10000000000L) { return DateTimeUtils.ofEpochMillisecond(source); } return DateTimeUtils.ofEpochSecond(source); }
default LocalDateTime stringToLocalDateTime(String source) { if (source == null) return null; if (source.length() == 10) { LocalDate date = stringToLocalDate(source); return LocalDateTime.of(date, LocalTime.MIN); } return DateTimeUtils.parse(source); } }
|
2、自定义mapper
开发中如需要对象转换操作可直接新建interface并继承BasicObjectMapper<S,T>,并在新建的接口上加上
@Mapper(componentModel = “spring”),
3、字段不一致地方配置mapping
1 2 3 4 5 6 7 8 9 10 11 12
| package com.imaxun.demo.framework.permission.server.service.mappers;
import com.imaxun.demo.framework.common.mapstruct.BasicObjectMapper; import com.imaxun.demo.framework.permission.server.dao.entity.AppEntity; import com.imaxun.demo.framework.permission.vo.AppVO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers;
@Mapper public interface AppMappers extends BasicObjectMapper<AppVO, AppEntity> { AppMappers INSTANCE = Mappers.getMapper(AppMappers.class); }
|