如何使用 BeanUtils 复制具有列表的对象?

How to copy object that has a list with BeanUtils?

我正在开发一个多 Maven 模块,我想使用 BeanUtils 从实体复制到模型,这是我尝试过的:

public List<ReleveBancaireCreationRequestDomain> getReleveBancaires() {
    List<ReleveBancaireCreationRequestDomain> releveBancaireList = new ArrayList<>();
    List<ReleveBancaireEntity> releveBancaireEntityList = releveBancaireRepository.findAll();
    for (ReleveBancaireEntity r : releveBancaireEntityList) {
        ReleveBancaireCreationRequestDomain releveBancaire = new ReleveBancaireCreationRequestDomain();
        BeanUtils.copyProperties(r, releveBancaire);
        releveBancaireList.add(releveBancaire);
    }
    return releveBancaireList;
}

这是我的实体(getters/setter/noargs/allargs):

@Entity
public class ReleveBancaireEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long releveBancaireId;
    @CreationTimestamp
    @Temporal(TemporalType.DATE)
    private Date dateReception;
    private String label;
    private int nbrLignes;
    private int nbrOperationCredit;
    private int nbrOperationDebit;
    private BigDecimal soldeInitial;
    private BigDecimal soleFinal;
    @OneToMany(cascade= CascadeType.ALL,mappedBy = "releveBancaire", fetch = FetchType.EAGER)
    @JsonIgnoreProperties("releveBancaire")
    @JsonIgnore
    private List<LigneReleveEntity> lignereleve = new ArrayList<>();

这是我的模型(DTO 模型):

public class ReleveBancaireCreationRequestDomain {

    private String label;
    private int nbrLignes;
    private int nbrOperationCredit;
    private BigDecimal soldeInitial;
    private BigDecimal soleFinal;
    private List<LigneReleveCreationRequestDomain> lignereleve = new ArrayList<>();

这是我得到的输出:

[
    {
        "label": "RELEVE_1",
        "nbrLignes": 15,
        "nbrOperationCredit": 7,
        "soldeInitial": 145.20,
        "soleFinal": 158.36,
        "lignereleve": []
    }
]

问题是字段被复制但列表没有,它显示一个空列表。请问有什么解决办法吗

列表未被复制的原因是它们属于不同类型。在您的源对象中,该列表的类型为 LigneReleveEntity,在您的目标中,该列表的类型为 LigneReleveCreationRequestDomain.

如果你想使用副本,那么它们要么是相同的类型,要么实现相同的接口。

在不知道 类 包含什么的情况下,这是一个简单的示例,假设它们在名为 value.

的字段中包含单个字符串值

创建界面

public interface StringValue {
  String getValue();
}

在您的每个 类 上实现接口

public class LigneReleveCreationRequestDomain implements StringValue {

...

public class LigneReleveEntity implements StringValue {

在您的包装器 类 中,通过接口而非实现引用这些属性:

private List<StringValue> lignereleve = new ArrayList<>();

...

private List<StringValue> lignereleve = new ArrayList<>();