ModelMapper - как рассчитать значение из источника и установить его в пункт назначения - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь использовать ModelMapper для сопоставления источника и назначения.

В моем конкретном случае c в исходном классе есть свойство (Список проверок), где я должен суммировать по рейтингу и установить это значение в качестве класса назначения.

Итак Я пробовал с конвертером, но он не работает.

        Converter<List<Review>, Double> sumReviewsRating = new AbstractConverter<List<Review>, Double>() {
        @Override
        protected Double convert(List<Review> reviews) {
            if(reviews!=null){
                return reviews.stream().mapToDouble(Review::getRating).sum();
                //it doesn't work also with return 1.0 for example;
            }else{
                return 0.0;
            }
        }
    };

 modelMapper.typeMap(MySource.class, MyDestination.class).addMappings(mapper ->{
            mapper.map(MySource::getCoverImageId, MyDestination::setImageUrl); //this works
            mapper.using(sumReviewsRating).map(MySource::getReviews, MyDestination::setRating);
        });

Stacktrace:

org.modelmapper.internal.ErrorsException: null
    at org.modelmapper.internal.Errors.toException(Errors.java:254) ~[modelmapper-2.3.6.jar:na]
    at org.modelmapper.internal.ReferenceMapExpressionImpl.map(ReferenceMapExpressionImpl.java:71) ~[modelmapper-2.3.6.jar:na]
    at org.modelmapper.internal.ConfigurableConditionExpressionImpl.map(ConfigurableConditionExpressionImpl.java:65) ~[modelmapper-2.3.6.jar:na]

Если я поставлю точку останова в конвертере, она не войдет.

Где моя загадка?

1 Ответ

0 голосов
/ 06 января 2020

Для меня сработало следующее:

ModelMapper modelMapper = new ModelMapper();

Converter<List<String>, Double> sumReviewsRating = new AbstractConverter<List<String>, Double>() {
      @Override
      protected Double convert(List<String> reviews) {
        if(reviews!=null){
          return 1.0;
          //it work also with return 1.0 for example;
        }else{
          return 0.0;
        }
      }
    };

    modelMapper.typeMap(MySource.class, MyDestination.class).addMappings(mapper ->{
      mapper.using(sumReviewsRating).map(MySource::getReview, MyDestination::setRating);
    });

    MySource mySource = new MySource();
    mySource.setReview(Arrays.asList(new String[]{"1","2"}));
    MyDestination destination = modelMapper.map(mySource,MyDestination.class);

    System.out.println(destination.getRating());

Классы

@Getter @Setter
public class MyDestination {
  Double rating;
}


@Getter @Setter
public class MySource {
  List<String> review;
}

Приведенный выше код успешно выполнил преобразование.

Попробуйте добавить несколько сопоставлений, подобных этой

**

typeMap.addMappings(mapper -> mapper.<String>map(Src::getA, Dest::setB))
          .addMappings(mapper -> mapper.<String>skip(Dest::setB))

**

...