如何使用 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<>();
我正在开发一个多 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<>();