Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MapStruct:如何将所有属性映射到列表的第一个元素?_Java_Mapping_Mapstruct - Fatal编程技术网

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

Java MapStruct:如何将所有属性映射到列表的第一个元素?,java,mapping,mapstruct,Java,Mapping,Mapstruct,我需要一个映射来实现这一点: @Mapping(source = "a", target = "result.transactions[0].a"), @Mapping(source = "b", target = "result.transactions[0].b"), @Mapping(source = "c", target = "result.transactions[0].c"), ... Response dataToResponse(DataModel model); 但是这种语

我需要一个映射来实现这一点:

@Mapping(source = "a", target = "result.transactions[0].a"),
@Mapping(source = "b", target = "result.transactions[0].b"),
@Mapping(source = "c", target = "result.transactions[0].c"),
...
Response dataToResponse(DataModel model);
但是这种语法不起作用(顺便说一句:这适用于Springbean包装器)。 像这样的解决方案只是半熟的解决方案:

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

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

刚刚遇到这个问题。更优雅的解决方案是这样的:

@Mapping(source = "a", target = "transaction.a"),
@Mapping(source = "b", target = "transaction.b"),
@Mapping(source = "c", target = "transaction.c"),
...
Transaction dataToTransaction(DataModel model);
@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(player.getAddressBooks().get(0).getPostCode())", target = "postCode")
@Mapping(expression = "java(player.getAddressBooks().get(0).getCity())", target = "city")
@Mapping(expression = "java(player.getAddressBooks().get(0).getStreetNumber())", target = "streetNumber")
@Mapping(expression = "java(player.getAddressBooks().get(0).getStreetName())", target = "streetName")
@Mapping(expression = "java(player.getAddressBooks().get(0).getCountryISO())", target = "countryISO")
  • 这与前面的答案相同
剩下要做的是将单个事务映射到一个元素列表:

default List<Transaction> mapTransactionToList(Transaction source) {
     return ImmutableList.of(source);
}
默认列表mapTransactionToList(事务源){
返回不可变列表(源);
}
现在,您可以在
@Mapping
定义中将
模型
映射到
列表
,而MapStruct应该知道该做什么

我认为这看起来比基于“表达式”的解决方案更好,更不容易出错


请注意,您可以在映射器界面中包含代码。

我认为使用表达式是此处的工作重点:

public interface MyMapper {
    @Mapping(target = "subjectName", expression = "java(source.getCourses().get(0).getCourseName())")
    Target map(Source source);
} 
另请查看此处了解更多信息:

在我的代码中,我是这样做的:

@Mapping(source = "a", target = "transaction.a"),
@Mapping(source = "b", target = "transaction.b"),
@Mapping(source = "c", target = "transaction.c"),
...
Transaction dataToTransaction(DataModel model);
@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(player.getAddressBooks().get(0).getPostCode())", target = "postCode")
@Mapping(expression = "java(player.getAddressBooks().get(0).getCity())", target = "city")
@Mapping(expression = "java(player.getAddressBooks().get(0).getStreetNumber())", target = "streetNumber")
@Mapping(expression = "java(player.getAddressBooks().get(0).getStreetName())", target = "streetName")
@Mapping(expression = "java(player.getAddressBooks().get(0).getCountryISO())", target = "countryISO")