• Mapstruct使用---一种JAVABEAN 转化工具


    首先,导入包[注意,这里留一个关子]

         <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

  • 相关阅读:
    1029: [JSOI2007]建筑抢修
    1028: [JSOI2007]麻将
    1050 棋盘染色 2
    1026: [SCOI2009]windy数
    1074: [SCOI2007]折纸origami
    839. Optimal Marks
    1024: [SCOI2009]生日快乐
    1025: [SCOI2009]游戏
    1023: [SHOI2008]cactus仙人掌图
    对前面的总结
  • 原文地址:https://www.cnblogs.com/mmh760/p/14940574.html
Copyright © 2020-2023  润新知