首先,导入包[注意,这里留一个关子]
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.2.0.Final</version> </dependency>
新建实体类User
package com.mmh.epeius.server.javabase.mapstruct; import lombok.Data; import lombok.experimental.Accessors; import java.time.LocalDate; import java.time.LocalDateTime; /** * @author : maominghai * @date : 2021/6/27 14:10 */ @Data @Accessors(chain = true) public class User { private Long id; private String username; private String password; // 密码 private Integer sex; // 性别 private LocalDate birthday; // 生日 private LocalDateTime createTime; // 创建时间 private String config; // 其他扩展信息,以JSON格式存储 }
新建VO类 UserVo
package com.mmh.epeius.server.javabase.mapstruct; import lombok.Data; import lombok.experimental.Accessors; import java.time.LocalDate; import java.util.List; /** * @author : maominghai * @date : 2021/6/27 14:11 */ @Data @Accessors(chain = true) public class UserVo { private Long id; private String username; private String password; private Integer gender; private LocalDate birthday; private String createTime; private List<UserConfig> config; @Data public static class UserConfig { private String field1; private Integer field2; } }
新增映射接口,里面可以写很多的java bean 转化的映射方法,参数是source ,返回值是 target,@Mapping里面写映射关系,如下所示
package com.mmh.epeius.server.javabase.mapstruct; import com.alibaba.fastjson.JSON; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; import java.util.List; /** * @author : maominghai * @date : 2021/6/27 14:12 */ @Mapper public interface UserConverter { UserConverter INSTANCE = Mappers.getMapper(UserConverter.class); @Mapping(target = "gender", source = "sex") @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss") UserVo do2vo(User var1); @Mapping(target = "sex", source = "gender") @Mapping(target = "password", ignore = true) @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss") User vo2Do(UserVo var1); List<UserVo> do2voList(List<User> userList); default List<UserVo.UserConfig> strConfigToListUserConfig(String config) { return JSON.parseArray(config, UserVo.UserConfig.class); } default String listUserConfigToStrConfig(List<UserVo.UserConfig> list) { return JSON.toJSONString(list); } }
新增测试类,进行测试
package com.mmh.epeius.server.javabase; import com.mmh.epeius.server.javabase.mapstruct.User; import com.mmh.epeius.server.javabase.mapstruct.UserConverter; import com.mmh.epeius.server.javabase.mapstruct.UserVo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.testng.AssertJUnit.assertNotNull; /** * @author : maominghai * @date : 2021/6/27 14:16 */ @RunWith(SpringRunner.class) @SpringBootTest public class MapStructTest { @Test public void do2VoTest() { User user = new User() .setId(1L) .setUsername("zhangsan") .setSex(1) .setPassword("abc123") .setCreateTime(LocalDateTime.now()) .setBirthday(LocalDate.of(1999, 9, 27)) .setConfig("[{"field1":"Test Field1","field2":500}]"); UserVo userVo = UserConverter.INSTANCE.do2vo(user); // asset assertNotNull(userVo); assertEquals(userVo.getId(), user.getId()); // print System.out.println(user); System.out.println(userVo); // User(id=1, username=zhangsan, password=abc123, sex=1, birthday=1999-09-27, createTime=2020-08-17T14:54:01.528, config=[{"field1":"Test Field1","field2":500}]) // UserVo(id=1, username=zhangsan, password=abc123, gender=1, birthday=1999-09-27, createTime=2020-08-17 14:54:01, config=[UserVo.UserConfig(field1=Test Field1, field2=500)]) } @Test public void vo2DoTest() { UserVo.UserConfig userConfig = new UserVo.UserConfig(); userConfig.setField1("Test Field1"); userConfig.setField2(500); UserVo userVo = new UserVo() .setId(1L) .setUsername("zhangsan") .setGender(2) .setCreateTime("2020-01-18 15:32:54") .setBirthday(LocalDate.of(1999, 9, 27)) .setConfig(Collections.singletonList(userConfig)); User user = UserConverter.INSTANCE.vo2Do(userVo); // asset assertNotNull(userVo); assertEquals(userVo.getId(), user.getId()); // print System.out.println(user); System.out.println(userVo); } }
不出意外,代码报错:
java.lang.ExceptionInInitializerError at com.mmh.epeius.server.javabase.MapStructTest.do2VoTest(MapStructTest.java:37) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Cannot find implementation for com.mmh.epeius.server.javabase.mapstruct.UserConverter at org.mapstruct.factory.Mappers.getMapper(Mappers.java:79) at com.mmh.epeius.server.javabase.mapstruct.UserConverter.<clinit>(UserConverter.java:16) ... 31 more Caused by: java.lang.ClassNotFoundException: Cannot find implementation for com.mmh.epeius.server.javabase.mapstruct.UserConverter at org.mapstruct.factory.Mappers.getMapper(Mappers.java:93) at org.mapstruct.factory.Mappers.getMapper(Mappers.java:76) ... 32 more
说是我们刚才写的映射接口找不到实现类,原因是我们少包了,在原来的基础上,在加上如下依赖
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> </dependency>
再次运行,可以看到,没问题了
User(id=1, username=zhangsan, password=abc123, sex=1, birthday=1999-09-27, createTime=2021-06-27T14:46:58.680, config=[{"field1":"Test Field1","field2":500}])
UserVo(id=1, username=zhangsan, password=abc123, gender=1, birthday=1999-09-27, createTime=2021-06-27 14:46:58, config=[UserVo.UserConfig(field1=Test Field1, field2=500)])
示例代码参考:https://www.pdai.tech/md/develop/package/dev-package-x-mapstruct.html