当前位置: 首页 > 知识库问答 >
问题:

Mapstruct 1.4.x-可迭代到nonit。示例与目标点运算符的工作方式很奇怪

宋伟泽
2023-03-14

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

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

其他类保持原样。

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(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个答案

扶文光
2023-03-14

MapStruct不允许映射到字符串。当您使用target=“.”时,您表示要将第一个元素的属性映射到目标的属性。

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

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

 类似资料:
  • 本文向大家介绍js表达式与运算符简单操作示例,包括了js表达式与运算符简单操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js表达式与运算符简单操作。分享给大家供大家参考,具体如下: 运行结果: 感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。 更多关于Java

  • 问题内容: 请考虑以下代码片段: 据我所知(以及我的IDE可以告诉我的),变量和应该是等效的。 如您所料,我宁愿写最后2行而不是前7行。但是,当我向该方法传递3个空值时,在变量的计算上得到了NPE 。 有人知道这怎么可能吗?即使条件不满足,三元运算符也会评估第二部分吗? (Java版本1.6.0_21) 问题答案: 尝试: 要么 三元运算符的交替边的类型是和,这意味着将get取消装箱到,然后在赋值

  • 本文向大家介绍Python可迭代对象操作示例,包括了Python可迭代对象操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python可迭代对象。分享给大家供大家参考,具体如下: 1、列表生成式 输出: <class 'generator'> <generator object <genexpr> at 0x0000024E6AC08F10> 0 输出: [0, 1, 2, 3,

  • 问题内容: Python似乎在创建列表对象和何时创建列表对象之间有所区别。为什么会有这种差异? 虽然第一个表达式似乎按预期工作,但第二个表达式的工作方式更像是迭代dict: 问题答案: 是包含 元素 的列表。 接受(必须已经可以 迭代 !)并将其转换为列表。 列表构造函数-像python的所有内置集合类型(集合,列表,元组,collections.deque等)一样- 可以采用一个可迭代的参数并将

  • 本文向大家介绍C#MSDN隐式运算符示例,包括了C#MSDN隐式运算符示例的使用技巧和注意事项,需要的朋友参考一下 示例 输出: 从数字到双精度 隐式转换称为 num = 7 dig2 = 12 .NET Fiddle上的实时演示

  • 本文向大家介绍Python运算符+与+=的方法实例,包括了Python运算符+与+=的方法实例的使用技巧和注意事项,需要的朋友参考一下 Python 中如果需要对一个变量进行增量运算通常有两种写法,a = a + b 或 a += b。虽然两种方法能够得到同样的结果,但两者却并不完全等价。 加法运算符 + 对于 a = a + b 这条语句来说,实际上执行了两步操作,首先执行 a + b 求出两者