mapstruct List之间转换自定义规则
时间: 2023-07-18 15:24:13 浏览: 288
MapStruct实体转换及List转换的方法讲解
当我们使用 MapStruct 进行 List 之间的转换时,我们可以使用自定义的转换规则来实现,具体的步骤如下:
1. 定义自定义的转换方法
首先,我们需要在 Mapper 接口中定义一个自定义的转换方法,该方法接收两个参数,分别是源列表和目标列表,然后在方法体中实现转换逻辑。例如:
```
@Mapper
public interface UserMapper {
UserDto toDto(User user);
User toEntity(UserDto dto);
List<UserDto> toDtoList(List<User> userList);
List<User> toEntityList(List<UserDto> dtoList);
default List<UserDto> toDtoListWithCustomRule(List<User> userList) {
return userList.stream().map(this::toDtoWithCustomRule).collect(Collectors.toList());
}
default UserDto toDtoWithCustomRule(User user) {
UserDto dto = toDto(user);
// 自定义转换逻辑
dto.setFullName(user.getFirstName() + " " + user.getLastName());
return dto;
}
}
```
在上面的例子中,我们定义了一个名为 toDtoWithCustomRule 的自定义方法,该方法接收一个 User 对象作为参数,返回一个经过自定义转换后的 UserDto 对象。在自定义方法中,我们可以实现任意的转换逻辑,比如在 UserDto 对象中设置一个全名属性,该属性值为 User 对象的 firstName 和 lastName 拼接而成。
2. 调用自定义的转换方法
接下来,我们可以在其他转换方法中调用自定义的转换方法,例如:
```
@Mapper
public interface OrderMapper {
OrderDto toDto(Order order);
Order toEntity(OrderDto dto);
List<OrderDto> toDtoList(List<Order> orderList);
List<Order> toEntityList(List<OrderDto> dtoList);
@Mapping(target = "userList", source = "order.userList")
OrderDto toDtoWithCustomRule(Order order);
@Mapping(target = "userList", source = "dto.userList")
Order toEntityWithCustomRule(OrderDto dto);
default List<OrderDto> toDtoListWithCustomRule(List<Order> orderList) {
return orderList.stream().map(this::toDtoWithCustomRule).collect(Collectors.toList());
}
default OrderDto toDtoWithCustomRule(Order order) {
OrderDto dto = toDto(order);
// 调用自定义转换方法
dto.setUserList(userMapper.toDtoListWithCustomRule(order.getUserList()));
return dto;
}
default Order toEntityWithCustomRule(OrderDto dto) {
Order order = toEntity(dto);
// 调用自定义转换方法
order.setUserList(userMapper.toEntityListWithCustomRule(dto.getUserList()));
return order;
}
}
```
在上面的例子中,我们在 toDtoWithCustomRule 和 toEntityWithCustomRule 方法中调用了 UserMapper 中定义的 toDtoListWithCustomRule 和 toEntityListWithCustomRule 方法,实现了对 User 列表的转换。
3. 注册自定义的转换方法
最后,我们需要在 Mapper 接口上添加 @Component 注解,将该接口注册为 Spring 组件,以便让 MapStruct 自动将其实例化并使用其中定义的转换方法。
```
@Mapper(componentModel = "spring", uses = UserMapper.class)
@Component
public interface OrderMapper {
// 省略其他方法
}
```
这样,我们就可以使用自定义的转换规则来实现 List 之间的转换了。
阅读全文