Mapstruct 1.4.x - 可迭代到非它。示例与目标点运算符一起工作很奇怪
Mapstruct 1.4.x - iterable to nonit. sample works strange with target dot operator
我想采用这里的示例
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;
}
}
其他class保持原样。
另一个例子:
嗨菲利普,抱歉我迟到了。我想通过使用“qualifiedBy”-attribute 向您展示另一个对我不起作用或正如我预期的用例。我错过了什么?
Class 地址:
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 + '\'' +
'}';
}
}
Class 有地址列表的客户:
public class CustomerManyAddresses {
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
private List<Address> addresses;
}
映射器 class:
@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);
}
}
...只打印新生成的地址,这里没有iterable to non-iter。再次使用。生成的 class:
@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;
}
}
MapStruct 不允许映射到 String
。当你使用 target = "."
时,你是说你想将第一个元素的属性映射到目标的属性中。
你可以做的是将目标字符串包装到一个 bean 中,然后像这样进行映射。
不过我的建议是,当您只想返回一个 String 时,编写您自己的自定义方法。
我想采用这里的示例
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;
}
}
其他class保持原样。
另一个例子: 嗨菲利普,抱歉我迟到了。我想通过使用“qualifiedBy”-attribute 向您展示另一个对我不起作用或正如我预期的用例。我错过了什么?
Class 地址:
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 + '\'' +
'}';
}
}
Class 有地址列表的客户:
public class CustomerManyAddresses {
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
private List<Address> addresses;
}
映射器 class:
@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);
}
}
...只打印新生成的地址,这里没有iterable to non-iter。再次使用。生成的 class:
@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;
}
}
MapStruct 不允许映射到 String
。当你使用 target = "."
时,你是说你想将第一个元素的属性映射到目标的属性中。
你可以做的是将目标字符串包装到一个 bean 中,然后像这样进行映射。
不过我的建议是,当您只想返回一个 String 时,编写您自己的自定义方法。