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")