MapStruct Plus 是一个增强工具,用于简化 Java 类型之间的转换。它基于 MapStruct 框架,通过注解自动生成两个类之间的映射接口,这样就免去了手动定义映射接口的步骤,使得 Java 类型转换更加便捷和优雅。MapStruct Plus 支能够在编译期完成所有生成工作,提高了开发效率。
案例 1: 数据传输对象 (DTO) 到实体转换
在Web应用中,经常需要将DTO转换为数据库实体。这种转换常见于数据接收与处理层之间。
// 定义DTO
public class UserDto {
private String username;
private int age;
private boolean active;
}
// 定义实体
public class User {
private String username;
private int age;
private boolean active;
}
// 使用MapStruct Plus进行转换
@AutoMapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
User toEntity(UserDto dto);
UserDto toDto(User entity);
}
案例 2: 复杂对象的转换
当处理具有嵌套结构的复杂对象时,MapStruct Plus 可以自动处理深层次的对象映射,无需手动定义每个层级的转换逻辑。
// 定义嵌套结构
public class OrderDto {
private String orderId;
private UserDto user;
}
public class Order {
private String orderId;
private User user;
}
// 转换接口
@AutoMapper
public interface OrderMapper {
OrderMapper INSTANCE = Mappers.getMapper(OrderMapper.class);
Order toEntity(OrderDto dto);
OrderDto toDto(Order order);
}
案例 3: 枚举和特殊规则的处理
MapStruct Plus 允许在转换过程中加入特定的逻辑,如枚举转换或者特定条件下的属性映射。
public enum Status {
ACTIVE, INACTIVE
}
public class ProjectDto {
private String name;
private Status status;
}
public class Project {
private String name;
private String status;
}
// 枚举转换
@AutoMapper
public interface ProjectMapper {
ProjectMapper INSTANCE = Mappers.getMapper(ProjectMapper.class);
@Mapping(target = "status", expression = "java(dto.getStatus().name())")
Project toEntity(ProjectDto dto);
@Mapping(target = "status", expression = "java(Status.valueOf(entity.getStatus()))")
ProjectDto toDto(Project entity);
}
案例 4: 处理列表转换
经常需要在DTO和实体类之间转换列表数据,例如在处理用户列表或产品列表时。
// 用户实体和DTO
public class User {
private String name;
private int age;
}
public class UserDto {
private String name;
private int age;
}
// 转换接口
@AutoMapper
public interface UserListMapper {
UserListMapper INSTANCE = Mappers.getMapper(UserListMapper.class);
List<UserDto> toDtoList(List<User> users);
List<User> toEntityList(List<UserDto> userDtos);
}
案例 5: 处理空值和默认值
在实际应用中,经常需要处理空值,或者在数据为空时提供默认值。
public class ProductDto {
private String name;
private Double price;
}
public class Product {
private String name;
private double price; // 原始类型不能为 null
}
@AutoMapper
public interface ProductMapper {
ProductMapper INSTANCE = Mappers.getMapper(ProductMapper.class);
@Mapping(target = "price", source = "price", defaultValue = "0.0")
Product toEntity(ProductDto dto);
ProductDto toDto(Product product);
}
案例 6: 与Spring Boot集成
MapStruct Plus 可以与Spring Boot无缝集成,这使得依赖注入和自动配置更加简单。
@Configuration
public class MapperConfig {
@Bean
public UserMapper userMapper() {
return Mappers.getMapper(UserMapper.class);
}
}
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user/{id}")
public UserDto getUser(@PathVariable Long id) {
User user = userService.findById(id); // 假设有这样一个服务来获取用户
return userMapper.toDto(user);
}
}
案例 7: 使用高级映射特性
高级映射功能,如使用自定义方法或处理复杂嵌套结构,对于处理复杂数据模型特别有用。
public class EmployeeDto {
private String fullName;
private AddressDto address;
}
public class Employee {
private String firstName;
private String lastName;
private Address address;
}
public class AddressDto {
private String street;
private String city;
}
public class Address {
private String street;
private String city;
}
@AutoMapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
@Mapping(target = "firstName", expression = "java(splitName(employeeDto.getFullName())[0])")
@Mapping(target = "lastName", expression = "java(splitName(employeeDto.getFullName())[1])")
Employee toEntity(EmployeeDto employeeDto);
@Mapping(target = "fullName", expression = "java(employee.getFirstName() + ' ' + employee.getLastName())")
EmployeeDto toDto(Employee employee);
default String[] splitName(String fullName) {
return fullName.split(" ");
}
}
案例 8: 懒加载Spring Bean
懒加载在bean初始化耗费资源且不是立即必要的情况下非常有益。在MapStruct Plus中,您可以指定懒加载以延迟对bean的初始化,直到它们真正被需要为止。
@Configuration
public class MapperConfig {
// Lazy initialization of the mapper bean
@Lazy
@Bean
public OrderMapper orderMapper() {
return Mappers.getMapper(OrderMapper.class);
}
}
// Usage within a Spring Service
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper; // This bean will be initialized lazily
public OrderDto convertToDto(Order order) {
return orderMapper.toDto(order);
}
}
案例 9: 自动生成反向转换逻辑
MapStruct Plus可以自动生成逆向映射的逻辑,简化了将数据转换回其原始形式或替代目标形式的过程,无需手动定义映射。
@AutoMapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
User toEntity(UserDto userDto);
// Automatically generate reverse mapping
UserDto toDto(User user);
}
public class UserService {
@Autowired
private UserMapper userMapper;
public User updateUserFromDto(UserDto userDto, User user) {
userMapper.updateUserFromDto(userDto, user); // Updates the user entity with data from DTO
return user;
}
// Example of using the reverse mapping
public UserDto convertToDto(User user) {
return userMapper.toDto(user); // Automatically uses the reverse conversion logic
}
}
这些示例展示了如何在Spring应用程序中利用MapStruct Plus的高级功能,简化配置并减少样板代码,使您的代码库更清晰、更易维护。