[英]Mapstruct from string to nested object for multiple fields with the same type
I have Entity class with fields: 我有Entity类的字段:
I have DTO class with fields: 我有DTO课的字段:
If I do like this: 如果我喜欢这样:
@Mappings({ @Mapping(source = "senderId", target = "sender.id"), @Mapping(source = "recipientId", target = "recipient.id") })
Mapstruct will generate code like this: Mapstruct将生成如下代码:
public Entity toEntity(DTO) {
//...
entity.setSender( dtoToClient( dto ) );
entity.setRecipient( dtoToClient( dto ) );
//...
protected Client dtoToClient(Dto dto) {
Client client = new Client();
client.setId( dto.getRecipientId() ); // mapstruct takes recipient id for sender and recipient
return client;
}
}
Mapstruct takes recipient id for sender and recipient instead of recipient id to create Client recipient and sender id to create Client sender. Mapstruct获取发件人和收件人的收件人ID而不是收件人ID,以创建客户端收件人和发件人ID以创建客户端发件人。
So the better way I've found is using expression that is not so elegant as far as I can see: 所以我发现更好的方法是使用不那么优雅的表达式,据我所知:
@Mappings({
@Mapping(target = "sender", expression = "java(createClientById(dto.getSenderId()))"),
@Mapping(target = "recipient", expression = "java(createClientById(dto.getRecipientId()))")
})
Could you plz suggest me how to map them? 你能告诉我如何映射它们吗?
Until the bug is resolved you will need to define the methods and use qualifedBy
or qualifiedByName
. 在解决错误之前,您需要定义方法并使用
qualifedBy
或qualifiedByName
。 More info about there here in the documentation. 有关此处的更多信息,请参阅文档。
Your mapper should look like: 您的映射器应如下所示:
@Mapper
public interface MyMapper {
@Mappings({
@Mapping(source = "dto", target = "sender", qualifiedByName = "sender"),
@Mapping(source = "dto", target = "recipient", qualifiedByName = "recipient")
})
Entity toEntity(Dto dto);
@Named("sender")
@Mapping(source = "senderId", target = "id")
Client toClient(Dto dto);
@Named("recipient")
@Mapping(source = "recipientId", target = "id")
Client toClientRecipient(Dto dto);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.