对象转换工具-Orika

  1. 提供的能力
  2. 配置
    1. pom引用
    2. 方式二所需配置类(可选)
  3. 案例
    1. 基础测试类
    2. 简易demo(更多用法参考官方文档)
    3. 执行结果
    4. Orika相关文档

提供的能力

Orika为开发者提供了如下功能:
1.映射复杂的、深层次结构性对象。
2.通过将嵌套属性映射到顶级属性,“拉平”或“展开”对象。
3.自动创建映射,并且在部分或所有映射上自定义。
4.创建转换器,以完全控制对象图中的任何特定对象集合的映射——按类型,甚至是通过特定的属性名。
5.处理代理或增强对象(如Hibernate或各种模拟框架)
6.用一个配置应用双向映射。
7.为一个目标抽象类或接口映射到具体的实现类。
8.映射POJO属性到Lists, Arrays, and Maps。

配置

pom引用

<!-- 方式一(推荐) -->
<dependency>
    <groupId>net.rakugakibox.spring.boot</groupId>
    <artifactId>orika-spring-boot-starter</artifactId>
    <version>1.9.0</version>
</dependency>

<!-- 方式二,需要在项目中加入配置类 -->
<dependency>
    <groupId>ma.glasnost.orika</groupId>
    <artifactId>orika-core</artifactId>
    <version>1.5.4</version>
    <scope>compile</scope>
</dependency>

方式二所需配置类(可选)

/**
 * 可自定义转换规则
 * **/
@Configuration
public class MapperFactoryAware {

    @Autowired
    private MapperFactory mapperFactory;

    @PostConstruct
    public void init(){
        mapperFactory.getConverterFactory().registerConverter(new BooleanConvert());
    }

    /** Boolean <=> Integer 互转 **/
    private class BooleanConvert extends BidirectionalConverter<Boolean,Integer>{

        @Override
        public Integer convertTo(Boolean source, Type<Integer> destinationType, MappingContext mappingContext) {
            return source ? 1 : 0;
        }

        @Override
        public Boolean convertFrom(Integer source, Type<Boolean> destinationType, MappingContext mappingContext) {
            return source == 1;
        }
    }
}

案例

基础测试类

// dto对象
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserInfoDTO {

    private String userId;
    private String userName;
    private String createTime;
    private List<String> ids;
    private String dtoName;
    private Integer sex;
}

// po对象
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserInfo {

    private Integer userId;
    private String userName;
    private Date createTime;
    private List<Integer> ids;
    private String poName;
    private Boolean sex;
}

简易demo(更多用法参考官方文档)

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = DemoApplication.class)
public class ConvertTest{

    @Autowired
    private MapperFacade mapperFacade;
    @Autowired
    private MapperFactory mapperFactory;

    //简易案例,属性名相同,类型不同
    @Test
    public void testSimple(){
        UserInfo userInfo = UserInfo.builder()
                .userId(10001)
                .ids(Arrays.asList(1002,1003,1004,1005))
                .userName("aaaa")
                .createTime(new Date())
                .build();

        //po 2 dto
        UserInfoDTO result = mapperFacade.map(userInfo, UserInfoDTO.class);
        log.info("po 2 dto =====> {}", JSON.toJSONString(result));

        //dto 2 po
        UserInfo info = mapperFacade.map(result, UserInfo.class);
        log.info("dto 2 po =====> {}", JSON.toJSONString(info));

        // pos 2 dtos
        List<UserInfo> pos = new ArrayList<>();
        pos.add(userInfo);
        List<UserInfoDTO> dtos = mapperFacade.mapAsList(pos,UserInfoDTO.class);
        log.info("pos 2 dtos =====> {}", JSON.toJSONString(dtos));

        // pos 2 dtos
        pos = mapperFacade.mapAsList(dtos, UserInfo.class);
        log.info("pos 2 dtos =====> {}", JSON.toJSONString(pos));

    }

    //属性名不同,需要先在mapperFactory中设置,然后获取到mapperFacade再使用
    @Test
    public void testDiff(){
        UserInfo userInfo = UserInfo.builder()
                .userId(10001)
                .ids(Arrays.asList(1002,1003,1004,1005))
                .userName("aaaa")
                .createTime(new Date())
                .poName("this is po")
                .build();

        //不同字段互转
        mapperFactory.classMap(UserInfo.class, UserInfoDTO.class)
                .field("poName", "dtoName")
                .byDefault()
                .register();
        MapperFacade mapperFacade = mapperFactory.getMapperFacade();

        //po 2 dto
        UserInfoDTO result = mapperFacade.map(userInfo, UserInfoDTO.class);
        log.info("po 2 dto =====> {}", JSON.toJSONString(result));

        //dto 2 po
        UserInfo info = mapperFacade.map(result, UserInfo.class);
        log.info("dto 2 po =====> {}", JSON.toJSONString(info));

        // pos 2 dtos
        List<UserInfo> pos = new ArrayList<>();
        pos.add(userInfo);
        List<UserInfoDTO> dtos = mapperFacade.mapAsList(pos,UserInfoDTO.class);
        log.info("pos 2 dtos =====> {}", JSON.toJSONString(dtos));

        // pos 2 dtos
        pos = mapperFacade.mapAsList(dtos, UserInfo.class);
        log.info("pos 2 dtos =====> {}", JSON.toJSONString(pos));
    }
}

执行结果

testSimple 执行结果:
-po 2 dto =====> {"createTime":"Wed Jun 02 10:11:51 CST 2021","ids":["1002","1003","1004","1005"],"userId":"10001","userName":"aaaa"}
-dto 2 po =====> {"createTime":1622650311000,"ids":[1002,1003,1004,1005],"userId":10001,"userName":"aaaa"}
-pos 2 dtos =====> [{"createTime":"Wed Jun 02 10:11:51 CST 2021","ids":["1002","1003","1004","1005"],"userId":"10001","userName":"aaaa"}]
-pos 2 dtos =====> [{"createTime":1622650311000,"ids":[1002,1003,1004,1005],"userId":10001,"userName":"aaaa"}]

testDiff 执行结果:
po 2 dto =====> {"createTime":"Sat Mar 20 14:30:46 CST 2021","dtoName":"this is po","ids":["1002","1003","1004","1005"],"userId":"10001","userName":"aaaa"}
dto 2 po =====> {"createTime":1616272246000,"ids":[1002,1003,1004,1005],"poName":"this is po","userId":10001,"userName":"aaaa"}
pos 2 dtos =====> [{"createTime":"Sat Mar 20 14:30:46 CST 2021","dtoName":"this is po","ids":["1002","1003","1004","1005"],"userId":"10001","userName":"aaaa"}]
pos 2 dtos =====> [{"createTime":1616272246000,"ids":[1002,1003,1004,1005],"poName":"this is po","userId":10001,"userName":"aaaa"}]

Orika相关文档

文章标题:对象转换工具-Orika

字数:1.2k

本文作者:imfan

发布时间:2021-03-20, 14:15:00

最后更新:2022-05-19, 11:30:26

原始链接:https://wiki.aistart.cc/2021/03/20/backend/java/utils/convert/orika/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏