如何使用Orika映射嵌套关联实体的Order对象到DTO及复用已有配置
结论
完全可以复用已有映射配置,Orika 的映射规则是绑定到 MapperFactory 实例全局生效的,只要将 Sellers→SellersDto、Customers→CustomersDto 的映射规则都注册到同一个 MapperFactory 实例中,映射 Orders 到 OrdersDto 时会自动识别关联属性的类型,复用已有规则完成嵌套转换。
注意:如果你之前是为 Seller、Customer 转换单独创建了两个不同的
MapperFactory实例,那么跨实例的配置无法共享,需要把两个映射规则合并注册到同一个全局MapperFactory中才能生效。
1. 统一注册所有映射规则
全局共用同一个 MapperFactory 实例(Spring 项目可注册为单例 Bean 全局复用),按顺序注册你已有的 Seller、Customer 转换规则,再注册 Orders 转换规则即可:
import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory; // 全局唯一的MapperFactory,不要重复创建 MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); // 复用你之前写好的Sellers转SellersDto的配置 mapperFactory.classMap(Sellers.class, SellersDto.class) // 你之前已有的自定义字段映射、转换器等配置 .exclude("orders") // 建议排除懒加载的orders集合避免懒加载异常 .byDefault() .register(); // 复用你之前写好的Customers转CustomersDto的配置 mapperFactory.classMap(Customers.class, CustomersDto.class) // 你之前已有的自定义字段映射、转换器等配置 .exclude("orders") // 同理排除懒加载字段 .byDefault() .register(); // 直接配置Orders到OrdersDto的映射,无需单独处理seller、customer属性 mapperFactory.classMap(Orders.class, OrdersDto.class) // 如果有其他非同名需要自定义映射的字段,在这里补充配置 .byDefault() .register();
2. 映射使用示例
直接通过 MapperFacade 转换即可,关联属性会自动复用已有规则完成转换:
// 从数据库查询到的Orders实体 Orders orders = orderRepository.findById(orderId).get(); // 转换为DTO OrdersDto ordersDto = mapperFactory.getMapperFacade().map(orders, OrdersDto.class); // 此时ordersDto.getSeller()就是SellersDto类型,getCustomer()就是CustomersDto类型,完全复用你之前的映射规则
常见问题说明
- 如果关联属性的字段名和DTO中字段名不一致,只需要在 Orders 的映射配置中通过
field("seller.xxx", "sellerDtoField.xxx")单独指定即可,不需要重写整个 Seller 的转换逻辑。 - 懒加载的集合字段如果不需要序列化到DTO,一定要在映射规则中排除,否则会触发持久化上下文关闭后的懒加载异常。
内容的提问来源于stack exchange,提问作者kiryushinsa
相关产品推荐
相关产品推荐

