mapstruct 将方法应用于列表中的所有对象

mapstruct apply method to all objects from a list

我的问题:我想使用 mapstructPersonB 类型的 class 映射到 PersonA 并映射到 trim 所有找到的字符串在 List<Address> addresses .

public class PersonA {

     List<Address> addresses;
}

public class PersonB {
     List<Address> addresses;
}

public Address {
     String name;
}

@Mapper
public interface PersonMapper {

    @Mapping(target = "addresses.name", qualifiedByName = "trim")
    public PersonA mapToPersonA(final PersonB person);

    @Named("trim")
    public static String trim(final String value) {
        return value != null ? value.trim() : null;
    }
}

我的结构有点复杂,但我试着总结一下。我不知道为什么这个映射器没有按预期工作以及为什么字符串不是 trimmed.

目前 MapStruct 不允许为集合定义嵌套目标映射。

此外,您的 PersonAPersonBAddress 类型相同。这意味着 MapStruct 不会创建对象的副本,而是通过引用来复制它。

要解决第一个问题,您需要定义一个显式方法来映射 Address

例如

@Mapper
public interface PersonMapper {

    PersonA mapToPersonA(final PersonB person);

    @Mapping(target = "name", qualifiedByName = "trim")
    Address cloneAddress(Address address);

    @Named("trim")
    public static String trim(final String value) {
        return value != null ? value.trim() : null;
    }
}

这也将解决第二个问题,因为 MapStruct 将使用特定方法来映射地址。