orika-Java bean属性复制工具使用

orika:Java bean属性复制工具,底层基于javassist生成字段属性映射的字节码,运行时动态加载执行字节码,性能上比cglib的BeanCopier稍差。

Github地址:github.com/orika-mappe…

maven依赖

引入orika-core包

1
2
3
4
5
xml复制代码<dependency>
   <groupId>ma.glasnost.orika</groupId>
   <artifactId>orika-core</artifactId>
   <version>1.5.4</version>
</dependency>

Java使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
xml复制代码<!-- 测试demo依赖    -->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.22</version>
</dependency>
<dependency>
   <groupId>org.junit.jupiter</groupId>
   <artifactId>junit-jupiter</artifactId>
   <version>5.8.1</version>
</dependency>
<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>29.0-jre</version>
</dependency>

常用操作:

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
java复制代码package bean;

import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.converter.ConverterFactory;
import ma.glasnost.orika.converter.builtin.DateToStringConverter;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import org.junit.jupiter.api.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

/**
* The type Orika demo test.
*/
class OrikaDemoTest {

   @Test
   void testMap() {
       DefaultMapperFactory mapperFactory = getMapperFactory();
       MapperFacade facade = mapperFactory.getMapperFacade();

       SourceClass source = getSourceClass();
       // 基本使用
       TargetClass target = facade.map(source, TargetClass.class);
       compare(source, target);
       assertNotEquals(source.getEmail(), target.getMyEmail());
  }

   @Test
   void testMapAsList() {
       DefaultMapperFactory mapperFactory = getMapperFactory();
       MapperFacade facade = mapperFactory.getMapperFacade();

       SourceClass source = getSourceClass();
       // 集合映射
       List<TargetClass> target = facade.mapAsList(Lists.newArrayList(source), TargetClass.class);
       compare(source, target.get(0));
       assertNotEquals(source.getEmail(), target.get(0).getMyEmail());
  }

   @Test
   void testDiffFieldName() {
       DefaultMapperFactory mapperFactory = getMapperFactory();
       // 设置不同字段名双向映射
       mapperFactory.classMap(SourceClass.class, TargetClass.class)
              .field(SourceClass.Fields.email, TargetClass.Fields.myEmail)
              .byDefault()
              .register();

       MapperFacade facade = mapperFactory.getMapperFacade();
       SourceClass source = getSourceClass();
       TargetClass target = facade.map(source, TargetClass.class);
       compare(source, target);
       assertEquals(source.getEmail(), target.getMyEmail());
  }

   @Test
   void testConverter() throws ParseException {
       String format = "yyyy-MM-dd";
       DefaultMapperFactory mapperFactory = getMapperFactory();
       // 设置类型转换
       ConverterFactory converterFactory = mapperFactory.getConverterFactory();
       converterFactory.registerConverter(new DateToStringConverter(format));

       String birth = "2021-11-21";
       Date date = new SimpleDateFormat(format).parse(birth);
       SourceClass source = getSourceClass()
              .setBirth(date);

       MapperFacade facade = mapperFactory.getMapperFacade();
       TargetClass target = facade.map(source, TargetClass.class);
       compare(source, target);
       assertEquals(birth, target.getBirth());
  }

   private DefaultMapperFactory getMapperFactory() {
       return new DefaultMapperFactory.Builder().build();
  }

   private void compare(SourceClass source, TargetClass target) {
       assertEquals(source.getId(), target.getId());
       assertEquals(source.getName(), target.getName());
       assertEquals(source.getAge(), target.getAge());
  }

   private SourceClass getSourceClass() {
       return SourceClass.builder()
              .id(1L)
              .name("test")
              .age(18)
              .email("email@xxx")
              .build();
  }

   @Data
   @Builder
   @NoArgsConstructor
   @AllArgsConstructor
   @FieldNameConstants
   @Accessors(chain = true)
   static class SourceClass {
       private Long id;
       private String name;
       private Integer age;
       private String email;
       private Date birth;
  }

   @Data
   @Builder
   @NoArgsConstructor
   @AllArgsConstructor
   @FieldNameConstants
   static class TargetClass {
       private Long id;
       private String name;
       private int age;
       private String myEmail;
       private String birth;
  }

}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%