如何将Quotations对象转换为SingleQuotationDto并避免手动赋值?
解决方案
1. 用Spring BeanUtils实现自动属性拷贝
Spring自带的BeanUtils可以一键完成同属性名的对象拷贝,无需手动编写setter,后续实体新增属性也不用修改拷贝逻辑。
示例代码:
quotation.ifPresent(quotations -> { SingleQuotationDto dto = new SingleQuotationDto(); // 自动拷贝Quotations的所有属性到DTO BeanUtils.copyProperties(quotations, dto); dto.setReceiverName("Receiver's Name"); // 后续处理DTO });
由于SingleQuotationDto继承了Quotations,父类属性会被自动识别并拷贝,无需额外配置。
2. 用MapStruct做类型安全的映射
MapStruct是编译期生成映射代码的工具,类型安全且性能优异,适合复杂对象转换场景,能完美处理继承关系。
步骤1:添加Maven依赖
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <scope>provided</scope> </dependency>
步骤2:定义映射接口
@Mapper(componentModel = "spring") public interface QuotationMapper { QuotationMapper INSTANCE = Mappers.getMapper(QuotationMapper.class); // 直接实现Quotations到SingleQuotationDto的映射 SingleQuotationDto toSingleQuotationDto(Quotations quotations); }
步骤3:服务层使用
quotation.ifPresent(quotations -> { SingleQuotationDto dto = QuotationMapper.INSTANCE.toSingleQuotationDto(quotations); dto.setReceiverName("Receiver's Name"); // 后续处理 });
MapStruct会自动处理父类属性映射,新增属性只要保持名称一致,无需修改映射接口,编译期自动生成拷贝代码。
3. 优化构造函数拷贝(无第三方依赖)
如果不想引入外部工具,可以给SingleQuotationDto添加基于父类的构造函数,集中完成属性拷贝:
方式1:父类添加拷贝构造函数
@Getter @Setter @Entity // ... 其他注解 public class Quotations { // ... 现有属性 // 添加拷贝构造函数 public Quotations(Quotations other) { this.id = other.id; this.description = other.description; } }
方式2:DTO调用父类拷贝逻辑
@Getter @Setter public class SingleQuotationDto extends Quotations { private String receiverName; public SingleQuotationDto(Quotations quotations) { // 调用父类拷贝构造函数 super(quotations); } }
服务层使用
quotation.ifPresent(quotations -> { SingleQuotationDto dto = new SingleQuotationDto(quotations); dto.setReceiverName("Receiver's Name"); // 后续处理 });
这种方式只需修改一次构造函数,新增属性时不用在服务层重复修改,也避免了零散的setter调用。
内容的提问来源于stack exchange,提问作者xRay
相关产品推荐
相关产品推荐

