Mapstruct 1.4.x - 可迭代到 nonit。示例与目标点运算符

时间:2021-02-12 18:41:40

标签: java mapstruct

我想采用这里的样本

https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-iterable-to-non-iterable

不同之处在于使用“.”目标运算符而不是某些嵌套属性。给定样本,我想要“myString”作为结果,所以 String 将是新的目标。

但是,使用点运算符没有任何反应。什么都没有发生意味着 mapstruct 只创建一个新的 String 实例,而没有可迭代到不可迭代的映射。这是一种理想的行为吗?

正如这里所说的示例(从上面的示例中采用):

@Mapper( uses = IterableNonInterableUtil.class )
public interface SourceTargetMapper {

    SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );

    //@Mapping( source = "myIntegers", target = "myInteger", qualifiedBy = FirstElement.class )
    @Mapping( source = "myStrings", target = ".", qualifiedBy = LastElement.class )
    String toTarget( Source s );
}
public class Main {

    private Main() {
    }

    public static void main( String[] args ) {
        Source s = new Source();
        s.setMyIntegers( Arrays.asList( 5, 3, 7 ) );
        s.setMyStrings( Arrays.asList( "five", "three", "seven " ) );

       // Target t = SourceTargetMapper.MAPPER.toTarget( s );
       // System.out.println( t.getMyInteger() );
        //System.out.println( t.getMyString() );
        String t = SourceTargetMapper.MAPPER.toTarget( s );
        System.out.println(t);
    }
}

像生成的代码一样不打印任何内容:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-02-13T15:34:11+0100",
    comments = "version: 1.4.2.Final, compiler: javac, environment: Java 11.0.5 (JetBrains s.r.o)"
)
public class SourceTargetMapperImpl implements SourceTargetMapper {

    @Override
    public String toTarget(Source s) {
        if ( s == null ) {
            return null;
        }

        String string = new String();

        return string;
    }
}

其他类保持原样。


另一个例子: 嗨,菲利普,抱歉迟到了。我想通过使用“qualifiedBy”属性向您展示另一个对我不起作用或如我预期的用例。我错过了什么?

班级地址:

public class Address {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address(String name) {
        this.name = name;
    }

    private String name;

    @Override
    public String toString() {
        return "Address{" +
                "name='" + name + '\'' +
                '}';
    }
}

具有地址列表的类客户:

public class CustomerManyAddresses {

    public List<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }

    private List<Address> addresses;
}

Mapper 类:

@Mapper(uses = IterableNonInterableUtil.class)
public abstract class AddressMapper {

    @Mapping(target = ".", source = "addresses", qualifiedBy = FirstElement.class)
    abstract Address toSingle(CustomerManyAddresses customerManyAddresses);
}

和测试:

public class CustomerAddressMapperTest {

    private AddressMapper addressMapper = Mappers.getMapper(AddressMapper.class);

    @Test
    public void testCustomerMapper() {

        CustomerManyAddresses customerManyAddresses = new CustomerManyAddresses();
        Address address1 = new Address("first");
        Address address2 = new Address("second");
        Address address3 = new Address("third");
        customerManyAddresses.setAddresses(Arrays.asList(address1, address2, address3));

        Address singleAddress = addressMapper.toSingle(customerManyAddresses);
        System.out.println(singleAddress);
    }
}

...它只打印新生成的地址,这里不可迭代到非迭代器。再次使用。生成的类:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-02-20T11:05:53+0100",
    comments = "version: 1.4.2.Final, compiler: javac, environment: Java 11.0.5 (JetBrains s.r.o)"
)
public class AddressMapperImpl extends AddressMapper {

    @Override
    Address toSingle(CustomerManyAddresses customerManyAddresses) {
        if ( customerManyAddresses == null ) {
            return null;
        }

        String name = null;

        Address address = new Address( name );

        return address;
    }
}

1 个答案:

答案 0 :(得分:1)

MapStruct 不允许映射到 String。当您使用 target = "." 时,您表示要将第一个元素的属性映射到目标的属性中。

你可以做的是将目标字符串包装成一个bean,然后像这样进行映射。

当您只想返回一个字符串时,我建议您编写自己的自定义方法。

相关问题