MapStruct使用

MapStruct使用

简介: 背景 在一个成熟可维护的工程中,细分模块后,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;

/**
* <p></p>
* 基础转换类,提供基本的几个方法
* 并且接口类上一定要加上 {@link org.mapstruct.Mapper} 注解
*
* @Mapper(componentModel = "spring") 此注解可通过spring进行注入。
*/
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);
}


/*----------------转long--------------*/

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);
}