MapStruct :将多个源字段映射到一个目标字段

Dav*_*ave 0 mapstruct

考虑以下 POJO:

public class PersonVo {
    private String firstName;
    private String lastName;
}

private class PersonEntity {
    private String fullName;
}
Run Code Online (Sandbox Code Playgroud)

使用 MapStruct,我想创建映射PersonVoPersonEntity.
我需要映射多个源字段firstNamelastName一个目标归档fullName

这是我想要的伪代码。

[想要解决方案A]

@Mapper
public interface PersonMapper {
    @Mapping(target = "fullName", source = {"firstName", "lastName"}, qualifiedByName="toFullName")
    PersonEntity toEntity(PersonVo person);

    @Named("toFullName")
    String translateToFullName(String firstName, String lastName) {
        return firstName + lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

[想要解决方案B]

@Mapper
public interface PersonMapper {
    @Mapping(target = "fullName", source = PersonVo.class, qualifiedByName="toFullName")
    PersonEntity toEntity(PersonVo person);

    @Named("toFullName")
    String translateToFullName(PersonVo pserson) {
        return pserson.getFirstName() + pserson.getLastName();
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以实现吗?

Dav*_*ave 5

这是我的答案。

@Mapper
public interface PersonMapper {
    @Mapping(target = "fullName", source = ".", qualifiedByName="toFullName")
    PersonEntity toEntity(PersonVo person);

    @Named("toFullName")
    String translateToFullName(PersonVo pserson) {
        return pserson.getFirstName() + pserson.getLastName();
    }
}
Run Code Online (Sandbox Code Playgroud)

重点是

@Mapping(target = "fullName", source = "." ,qualifiedByName="toFullName")

它可以通过参数使用源对象。

  • 补充一点:您实际上并不需要 `qualifiedByName` ,除非您有另一个具有相同签名的方法:`String translateToFullName(PersonVo pserson)`.. 例如:`String translateToFullNameAndAddress(PersonVo pserson)`。限定符的目的是解决冲突。 (2认同)