三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Spring Boot 集成 Orika 对象映射框架完整指南

Spring Boot 集成 Orika 对象映射框架完整指南

1. 概述

Orika 是一个高效、轻量级的 Java Bean 映射框架,能够自动处理对象之间的属性复制和转换。本文将详细介绍如何在 Spring Boot 项目中集成和使用 Orika。

2. 环境准备

2.1 导入依赖

在项目的 pom.xml 文件中添加 Orika 依赖:

<dependency> <groupId>ma.glasnost.orika</groupId> <artifactId>orika-core</artifactId> <version>1.5.2</version> </dependency>

3. Spring Boot 配置

3.1 创建 MapperFactory 配置类

编写容器注入的类,将 Orika 的 MapperFactory 配置为 Spring Bean:

package com.kingboy.springboot.config; import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MapperFacotoryAutoWire { @Bean public MapperFactory getFactory(){ return new DefaultMapperFactory.Builder().build(); } }
import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OrikaConfig { @Bean public MapperFactory mapperFactory() { MapperFactory factory = new DefaultMapperFactory.Builder().build(); // 全局注册映射规则 factory.classMap(Person.class, Student.class) .field("dateTime", "birth") // 映射不同名的字段 .byDefault() // 其他同名字段自动映射 .register(); return factory; } }

4. 使用示例

4.1 单元测试示例

以下是一个完整的单元测试示例,展示如何使用 Orika 进行对象映射:

import ma.glasnost.orika.MapperFactory; 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.util.ArrayList; import java.util.Date; import java.util.List; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest(classes = KingBoyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class MapperFactoryTest { @Autowired private MapperFactory mapperFactory; /** * 测试单个对象映射 */ @Test public void copyBeanToBean() { // 1. 准备数据 Person person = new Person("king", 123, new Date()); // 2. 执行映射 (无需再次注册,配置类已处理) Student student = mapperFactory.getMapperFacade().map(person, Student.class); // 3. 验证结果 assertNotNull(student); assertEquals("king", student.getName()); assertEquals(Integer.valueOf(123), student.getAge()); assertEquals(person.getDateTime(), student.getBirth()); System.out.println("Single Object Mapping: " + student); } /** * 测试列表映射 */ @Test public void copyListToList() { // 1. 准备数据 List<Person> personList = getPersonList(); // 2. 执行列表映射 List<Student> students = mapperFactory.getMapperFacade().mapAsList(personList, Student.class); // 3. 验证结果 assertNotNull(students); assertEquals(personList.size(), students.size()); // 简单校验第一个元素 Student firstStudent = students.get(0); assertEquals("lucy1", firstStudent.getName()); assertEquals(Integer.valueOf(1), firstStudent.getAge()); // 打印结果 students.forEach(System.out::println); } private List<Person> getPersonList() { List<Person> list = new ArrayList<>(5); Date now = new Date(); for (int i = 1; i <= 5; i++) { list.add(new Person("lucy" + i, i, now)); } return list; } }

5. 实体类定义

5.1 Person 类

源对象 Person 类的定义:

package com.kingboy.springboot.domain; import java.time.LocalDateTime; import java.util.Date; public class Person { public Person() { } public Person(String name, Integer age, Date dateTime) { this.name = name; this.age = age; this.dateTime = dateTime; } private String name; private Integer age; private Date dateTime; public String getName() { return name; } public Person setName(String name) { this.name = name; return this; } public Integer getAge() { return age; } public Person setAge(Integer age) { this.age = age; return this; } public Date getDateTime() { return dateTime; } public Person setDateTime(Date dateTime) { this.dateTime = dateTime; return this; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", age=" + age + ", dateTime=" + dateTime + '}'; } }

5.2 Student 类

目标对象 Student 类的定义:

package com.kingboy.springboot.domain; import java.time.LocalDateTime; import java.util.Date; public class Student { private String name; private String grade; private Integer age; private Date birth; public Date getBirth() { return birth; } public Student setBirth(Date birth) { this.birth = birth; return this; } public String getName() { return name; } public Student setName(String name) { this.name = name; return this; } public String getGrade() { return grade; } public Student setGrade(String grade) { this.grade = grade; return this; } public Integer getAge() { return age; } public Student setAge(Integer age) { this.age = age; return this; } @Override public String toString() { return "Student{" + "name='" + name + ''' + ", grade='" + grade + ''' + ", age=" + age + ", birth=" + birth + '}'; } }

6. 总结

通过以上步骤,我们成功在 Spring Boot 项目中集成了 Orika 对象映射框架。Orika 提供了灵活的字段映射配置,支持单个对象和集合对象的映射,能够大大简化 Java Bean 之间的属性复制工作。

← 返回列表