java - Mapstruct 从字符串到具有相同类型的多个字段的嵌套对象

标签 java mapstruct

我有带字段的实体类:

  1. 客户发件人;
  2. 客户收件人;

我有带字段的 DTO 类:

  1. 长的senderId;
  2. 长recipientId;

如果我这样做:

@Mappings({ @Mapping(source = "senderId", target = "sender.id"), @Mapping(source = "recipientId", target = "recipient.id") })

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 为发件人和收件人使用收件人 ID 而不是收件人 ID 来创建客户端收件人和发件人 ID 来创建客户端发件人。

所以我发现更好的方法是使用在我看来不太优雅的表达式:

@Mappings({
      @Mapping(target = "sender", expression = "java(createClientById(dto.getSenderId()))"),
      @Mapping(target = "recipient", expression = "java(createClientById(dto.getRecipientId()))")
})

你能建议我如何映射它们吗?

最佳答案

在解决错误之前,您需要定义方法并使用 qualifiedByqualifiedByName。关于那里的更多信息here在文档中。

您的映射器应如下所示:

@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);
}

关于java - Mapstruct 从字符串到具有相同类型的多个字段的嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951058/

相关文章:

java - Mapstruct - 忽略集合内的属性

java - 将 Boolean 更改为 boolean 会在 MapStruct 中引发 noSuchMethodError

java - 摆脱未经检查的反射

java - 将变量添加到抽象类或子类?

java - 如何在spring security taglib中不提及hasRole ('ROLE_ADMIN')

intellij-idea - Intellij + Ajc + Lombok/Mapstruct

java - 使用 ObjectFactory 时 Mapstruct 无法映射属性

java - 如何在 JSpinner 中禁用值的舍入

Java getter 重载

jhipster - 如何修复不明确的映射方法