You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:24