官网
官方例子
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.1.RELEASEversion>
parent>
<groupId>my.boot.testgroupId>
<artifactId>my-boot-testartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.16version>
<scope>providedscope>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>2.9.2version>
dependency>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstructartifactId>
<version>1.5.5.Finalversion>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombok-mapstruct-bindingartifactId>
<version>0.2.0version>
dependency>
<dependency>
<groupId>org.mapstructgroupId>
<artifactId>mapstruct-processorartifactId>
<version>1.5.5.Finalversion>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-jsonartifactId>
<version>5.8.25version>
dependency>
dependencies>
<build>
<finalName>${project.artifactId}-8081finalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<mainClass>com.boot.test.ApplicationmainClass>
configuration>
plugin>
plugins>
build>
project>
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
public class AaDTO {
private String str;
private Integer intObjNum;
private int intNum;
private Date dateJUtil;
private List<String> listStr;
private Map<String,String> map;
private BigDecimal bigDecimal;
private String strA;
private Integer intObjNumA;
private int intNumA;
private Date dateJUtilA;
private List<String> listStrA;
private Map<String,String> mapA;
private BigDecimal bigDecimalA;
}
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
public class BbDTO {
private String str;
private Integer intObjNum;
private int intNum;
private Date dateJUtil;
private List<String> listStr;
private Map<String,String> map;
private BigDecimal bigDecimal;
}
import lombok.Data;
import java.math.BigDecimal;
@Data
public class CcDTO {
private BigDecimal bigDecimal;
private String nowDateStr;
}
import lombok.Data;
@Data
public class DdDTO {
private String s1;
private String s2;
private String s3;
private String s4;
}
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
public class AaaVO {
private String str;
private Integer intObjNum;
private int intNum;
private Date dateJUtil;
private String dateJUtilStr;
private List<String> listStr;
private Map<String,String> map;
private BigDecimal bigDecimal;
private String nowDateStr;
private String intObjNumStr;
}
import org.mapstruct.Mapping;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//自定义通用转换
//编译时注解
@Retention(RetentionPolicy.CLASS)
@Mapping(target = "nowDateStr", expression = "java(cn.hutool.core.date.DateUtil.today())")
public @interface ToVO {
}
import cn.hutool.core.util.IdUtil;
import com.boot.test.dto.AaDTO;
import com.boot.test.dto.CcDTO;
import com.boot.test.dto.DdDTO;
import com.boot.test.mapstruct.annotation.ToVO;
import com.boot.test.vo.AaaVO;
import org.mapstruct.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Mapper(componentModel="spring",unmappedTargetPolicy = ReportingPolicy.IGNORE
,imports = {cn.hutool.core.util.RandomUtil.class, IdUtil.class})
public interface MapStructConvertSpring {
/**
* Mapping注解的参数解释:
* 1、source:源属性名称,即DTO类下的属性名称
* 2、target:目标属性名称,即VO类下的属性名称
* https://mapstruct.org/documentation/stable/reference/html/#datatype-conversions
*
* before Java 8,需要用@Mappings包裹多个@Mapping
*/
@ToVO
@Mapping(target = "intNum", ignore = true)
@Mapping(target = "intObjNumStr",source = "intNum", numberFormat = "$#.00")
@Mapping(target = "dateJUtilStr",source = "dateJUtil", dateFormat = "yyyy-MM-dd HH:mm:ss")
AaaVO AaDTO2VO(AaDTO aaDTO);
default AaaVO toDIY(AaDTO dto){
AaaVO vo = new AaaVO();
vo.setStr("toDIY + " +dto.getStr());
return vo;
}
// 会把DTO里相同字段都转换到VO里
@Mapping(target = "intObjNum", ignore = true)
@Mapping(target = "str",source = "a.str")
@Mapping(target = "bigDecimal",source = "c.bigDecimal")
@Mapping(target = "intNum", source = "nn") //约定大于默认
AaaVO AaBbDTO2VO(AaDTO a , CcDTO c,Integer nn);
// 不成功
@Mapping( target = ".", source = "str" )
DdDTO default2VO(AaDTO dto);
void updateVO( AaDTO dto,@MappingTarget AaaVO vo);
@Mapping(target = "s1", source = "mk1")
DdDTO mapToDTO(Map<String, String> map);
@IterableMapping(numberFormat = "$#.00")
List<String> prices(List<BigDecimal> prices);
@InheritInverseConfiguration
List<BigDecimal> pricesInverse(List<String> ll );
@BeforeMapping
default void before(){
System.out.println("默认的前置转换...");
}
@BeforeMapping
default void before(List<BigDecimal> prices,@MappingTarget List<String> ll){
System.out.println("prices的前置转换...");
}
@AfterMapping
default void after(){
System.out.println("默认的后置转换...");
}
@AfterMapping
default void after(List<BigDecimal> prices,@MappingTarget List<String> ll){
System.out.println("prices的后置转换...");
}
@Mapping(target = "nowDateStr", source = "a.strA" ,defaultExpression = "java(IdUtil.fastSimpleUUID())")
@Mapping(target = "intObjNum", source = "nn")
@Mapping(target = "str",expression = "java(RandomUtil.randomString(a.getIntObjNum()) )")
AaaVO randomAaDTO2VO(AaDTO a,Integer nn);
}
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.boot.test.dto.AaDTO;
import com.boot.test.dto.BbDTO;
import com.boot.test.dto.CcDTO;
import com.boot.test.dto.DdDTO;
import com.boot.test.mapstruct.MapStructConvertSpring;
import com.boot.test.vo.AaaVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.*;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//SpringBoot2.2.0之前的版本 要加 @RunWith
@RunWith(SpringRunner.class)
public class AaaTestService {
@Autowired
private MapStructConvertSpring convertSpring;
AaDTO genAa(){
AaDTO dto = new AaDTO();
dto.setStr("strtttAAAAAAAA");
dto.setIntObjNum(Integer.valueOf(111));
dto.setIntNum(2222);
dto.setDateJUtil(DateUtil.date());
List<String> ll = new ArrayList<>();
ll.add("a1");
ll.add("a2");
ll.add("a3");
dto.setListStr(ll);
Map<String,String> map =new HashMap<>();
map.put("mk1","mv1");
map.put("mk2","mv2");
map.put("mk3","mv3");
dto.setMap(map);
dto.setBigDecimal(new BigDecimal("33.44"));
return dto;
}
BbDTO genBb(){
BbDTO dto = new BbDTO();
dto.setStr("strtttBBBBBB");
dto.setIntObjNum(Integer.valueOf(999));
dto.setIntNum(888);
dto.setListStr(Arrays.asList("b1","b2","b3"));
dto.setBigDecimal(new BigDecimal("99.88"));
return dto;
}
CcDTO genCc(){
CcDTO dto = new CcDTO();
dto.setBigDecimal(new BigDecimal("44.55"));
dto.setNowDateStr("fsdgdfgdfgfd");
return dto;
}
// 要经常clean
@Test
public void AaDtoV(){
AaaVO vo = convertSpring.AaDTO2VO(genAa());
System.out.println(JSONUtil.toJsonStr(vo));
}
@Test
public void AaDtoVDIY(){
AaaVO vo = convertSpring.toDIY(genAa());
System.out.println(JSONUtil.toJsonStr(vo));
}
@Test
public void AaBbDTO2VO(){
AaaVO vo = convertSpring.AaBbDTO2VO(genAa(),genCc(),888888);
System.out.println(JSONUtil.toJsonStr(vo));
// {"str":"strtttAAAAAAAA","intNum":2222,"dateJUtil":1706517743088,"listStr":["a1","a2","a3"],"map":{"mk1":"mv1","mk3":"mv3","mk2":"mv2"},"bigDecimal":44.55,"nowDateStr":"fsdgdfgdfgfd"}
}
@Test
public void default2VO(){
DdDTO ddDTO = convertSpring.default2VO(genAa());
System.out.println(JSONUtil.toJsonStr(ddDTO));
}
@Test
public void updateVO(){
AaaVO vo = new AaaVO();
convertSpring.updateVO(genAa(),vo);
System.out.println(JSONUtil.toJsonStr(vo));
}
@Test
public void mapToDTO(){
Map<String,String> map =new HashMap<>();
map.put("mk1","mv1");
map.put("mk2","mv2");
map.put("mk3","mv3");
DdDTO dto = convertSpring.mapToDTO(map);
System.out.println(JSONUtil.toJsonStr(dto));
}
@Test
public void prices(){
List<BigDecimal> ll= new ArrayList<>();
ll.add(new BigDecimal("11.22"));
ll.add(new BigDecimal("33.44"));
ll.add(new BigDecimal("55.66"));
ll.add(new BigDecimal("77.88"));
List<String> prices = convertSpring.prices(ll);
System.out.println(JSONUtil.toJsonStr(prices));
}
@Test
public void pricesInverse(){
List<BigDecimal> bigDecimals = convertSpring.pricesInverse(Arrays.asList("$3.44","$5.66","$7.88"));
System.out.println(JSONUtil.toJsonStr(bigDecimals));
}
@Test
public void randomAaDTO2VO(){
AaaVO vo = convertSpring.randomAaDTO2VO(genAa(),8);
System.out.println(JSONUtil.toJsonStr(vo));
}
}