BeanConvertor工具类:简化Java对象转换的利器
在Java开发中,我们经常需要在不同的对象之间转换数据。这可能是因为我们需要将数据从一个层(如数据访问层)转移到另一个层(如服务层或表示层),或者是因为我们需要将外部API的数据结构转换为我们的内部数据结构。这种转换过程可能会变得繁琐且容易出错。为了解决这个问题,我们可以自定义一个强大的工具类:BeanConvertor。
BeanConvertor类的完整代码
首先,让我们看一下BeanConvertor类的完整代码:
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.springframework.beans.BeanUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;/*** @desc: Bean转换工具类* @author: shy* @date: 2024/07/19 0:08*/
public class BeanConvertor {private static final ObjectMapper CONVERTOR_MAPPER = new ObjectMapper();/*** 将p1对象转换为 P2 类型的对象。* 基于反射,主要用于相同结构的对象间属性拷贝** @param fromObj 源对象* @param targetClazz 目标对象的类* @return p2 对象* @author shy* @date: 2024/07/19 0:08*/public static <P1, P2> P2 convertTo(P1 fromObj, Class<P2> targetClazz) {if (fromObj == null) {return null;}P2 targetObj;try {targetObj = targetClazz.newInstance();} catch (Exception e) {throw new IllegalArgumentException("Can not new object of class " + targetClazz.getName(), e);}BeanUtils.copyProperties(fromObj, targetObj);return targetObj;}/*** 将 源列表 中的对象拷贝到新目标类列表中。* 基于反射,主要用于相同结构的对象间属性拷贝** @param fromList 源列表* @param targetClazz 目标对象的泛型* @return 以目标类为元素类型的列表。* @author shy* @date: 2024/07/19 0:08*/public static <C1, C2> List<C2> convertListTo(List<C1> fromList, Class<C2> targetClazz) {if (fromList == null || fromList.isEmpty()) {return Collections.emptyList();}List<C2> targetList = new LinkedList<>();for (C1 fromObj : fromList) {targetList.add(convertTo(fromObj, targetClazz));}return targetList;}/*** 将p1对象转换为 P2 类型的对象。* 基于 JSON 序列化和反序列化,可以处理更复杂的类型转换* 例如: p1对象和p2对象中分别包含a对象和b对象, a对象和b对象中的字段是一致的, 并且在p1对象和p2对象中的属性名也是一致的, 这种情况下就需要使用json进行对象类型转化** @param fromObj 源对象* @param targetClazz 目标对象的类* @return P2* @author shy* @date: 2024/07/19 0:08*/public static <P1, P2> P2 convertByJackson(P1 fromObj, Class<P2> targetClazz) {return CONVERTOR_MAPPER.convertValue(fromObj, targetClazz);}/*** 将 源列表 中的对象拷贝到新目标类列表中。* 返回值的泛型根据接受参数决定* 基于 JSON 序列化和反序列化,可以处理更复杂的类型转换* 例如: p1对象和p2对象中分别包含a对象和b对象, a对象和b对象中的字段是一致的, 并且在p1对象和p2对象中的属性名也是一致的, 这种情况下就需要使用json进行对象类型转化** @param fromList 源列表* @param targetClazz 目标对象的泛型* @return List<C2>* @author shy* @date: 2024/07/19 0:08*/public static <C1, C2> List<C2> convertListByJackson(List<C1> fromList, Class<C2> targetClazz) {CollectionType collectionType = CONVERTOR_MAPPER.getTypeFactory().constructCollectionType(List.class, targetClazz);return CONVERTOR_MAPPER.convertValue(fromList, collectionType);}
}
现在,让我们详细介绍这个类中的每个方法,并提供相应的使用示例。
1. convertTo 方法
convertTo
方法用于将一个对象转换为另一个类型的对象。它使用Spring框架的BeanUtils.copyProperties
方法来复制属性。
示例:
public class Person {private String name;private int age;// getters and setters
}public class PersonDTO {private String name;private int age;// getters and setters
}// 使用示例
Person person = new Person();
person.setName("John");
person.setAge(30);PersonDTO personDTO = BeanConvertor.convertTo(person, PersonDTO.class);
System.out.println(personDTO.getName()); // 输出: John
System.out.println(personDTO.getAge()); // 输出: 30
2. convertListTo 方法
convertListTo
方法用于将一个对象列表转换为另一个类型的对象列表。它内部使用convertTo
方法来转换每个对象。
示例:
List<Person> personList = new ArrayList<>();
personList.add(new Person("John", 30));
personList.add(new Person("Alice", 25));List<PersonDTO> personDTOList = BeanConvertor.convertListTo(personList, PersonDTO.class);
for (PersonDTO dto : personDTOList) {System.out.println(dto.getName() + ": " + dto.getAge());
}
// 输出:
// John: 30
// Alice: 25
3. convertByJackson 方法
convertByJackson
方法使用Jackson库来进行对象转换。这种方法特别适用于处理嵌套对象的情况。
示例:
public class Address {private String street;private String city;// getters and setters
}public class AddressDto {private String street;private String city;// getters and setters
}public class Employee {private String name;private Address address;// getters and setters
}public class EmployeeDTO {private String name;private AddressDto address;// getters and setters
}// 使用示例
Employee employee = new Employee();
employee.setName("John");
Address address = new Address();
address.setStreet("123 Main St");
address.setCity("New York");
employee.setAddress(address);EmployeeDTO employeeDTO = BeanConvertor.convertByJackson(employee, EmployeeDTO.class);
System.out.println(employeeDTO.getName()); // 输出: John
System.out.println(employeeDTO.getAddress().getStreet()); // 输出: 123 Main St
System.out.println(employeeDTO.getAddress().getCity()); // 输出: New York
4. convertListByJackson 方法
convertListByJackson
方法使用Jackson库来转换对象列表。这种方法同样适用于处理包含嵌套对象的列表。
示例:
List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee("John", new Address("123 Main St", "New York")));
employeeList.add(new Employee("Alice", new Address("456 Elm St", "Los Angeles")));List<EmployeeDTO> employeeDTOList = BeanConvertor.convertListByJackson(employeeList, EmployeeDTO.class);
for (EmployeeDTO dto : employeeDTOList) {System.out.println(dto.getName() + ": " + dto.getAddress().getStreet() + ", " + dto.getAddress().getCity());
}
// 输出:
// John: 123 Main St, New York
// Alice: 456 Elm St, Los Angeles
5. 内容关联
大家也可以结合这篇文章, 使用FastJson完成对类中字段类型不一致的属性进行拷贝
Java中对象的拷贝之字段类型不一致
总结
BeanConvertor工具类提供了一种简单而强大的方式来处理Java对象之间的转换。它不仅可以处理简单的对象转换,还可以通过Jackson库处理更复杂的嵌套对象转换。这个工具类可以大大简化我们的代码,提高开发效率,并减少因手动转换可能引入的错误。
在实际开发中,你可能需要根据项目的具体需求来调整或扩展这个工具类。例如,你可能需要添加更多的错误处理,或者支持更多的转换场景。无论如何,这个BeanConvertor类为对象转换提供了一个很好的起点。