MapStruct:如何将所有属性映射到列表的第一个元素?

问题描述:

我需要一个映射,以实现这一目标:MapStruct:如何将所有属性映射到列表的第一个元素?

@Mapping(source = "a", target = "result.transaction[0].a"), 
@Mapping(source = "b", target = "result.transaction[0].b"), 
@Mapping(source = "c", target = "result.transaction[0].c"), 
... 
Response dataToResponse(DataModel model); 

但是这句法不工作(顺便说一句:这工作与Spring bean封装)。 像this一个解决方案仅仅是一个夹生的解决方案:

@AsList 
public <T> List<T> asList(T in) { 
    List<T> result = new ArrayList<T>(); 
    if (in!=null) { 
     result.add(in); 
    } 
    return result; 
} 

这只适用于只有一个属性,因为它总是会为每个属性的新名单。我不需要将每个属性映射到新列表的第一个元素。该列表必须重用,但我不知道这是如何工作的。什么是实现这一目标的正确途径? 我想过这样的事情:

@Mapping(source = "a", target = "transaction.a"), 
@Mapping(source = "b", target = "transaction.b"), 
@Mapping(source = "c", target = "transaction.c"), 
... 
Transaction dataToTransaction(DataModel model); 

然后......

@Mapping([use Transaction from b4], target = "result"); 

但我怎么能传递已经映射字段从上面? (我正在使用最新的最终版本1.1.0.Final)

显然没有干净的解决方案。于是,我只好解决方法是通过排除以下映射到一个单独的映射:

@Mapping(source = "a", target = "transaction.a"), 
@Mapping(source = "b", target = "transaction.b"), 
@Mapping(source = "c", target = "transaction.c"), 
Transaction dataToTransaction(DataModel model); 

在主映射器,我单独执行映射器,它通过表达式转换成一个列表:

@Mapping(expression = "java(Arrays.asList(SubMapper.INSTANCE.dataToTransaction(model)))", target = "result.transactions")