Сопоставить сущность с классами домена с помощью интерфейса, используя ModelMapper - PullRequest
0 голосов
/ 27 марта 2019

Учитывая следующие классы, интерфейс Fruit, пример реализации и класс FruitBasket, который содержит экземпляры Fruit объектов:

private interface Fruit {

}

private static class Apple implements Fruit {
    private String type;

   // ommitted
}

private static class FruitBasket {
    private Collection<Fruit> fruits = new ArrayList<>();

    // ommitted
}

Теперь для классов сущностей (все аннотации опущены), определены следующие классы:

private static class FruitEntity {

}

private static class AppleEntity extends FruitEntity {
    private String type;

    // ommitted
}

private static class FruitBasketEntity {
    private Collection<FruitEntity> fruits = new ArrayList<>();

    // ommitted
}

Теперь, если вы выполните

ModelMapper mapper = new ModelMapper();

FruitBasket basket = new FruitBasket();
basket.fruits.add(new Apple());

FruitBasketEntity entity = mapper.map(basket, FruitBasketEntity.class);

, entity действительно имеет объекты типа FruitEntity, но как настроить маппериспользовать правильный тип реализации для преобразования?

Кроме того, обратное сопоставление не работает, поскольку Fruit является интерфейсом и не имеет общедоступного конструктора.

FruitBasketEntity basketEntity = new FruitBasketEntity();
basketEntity.fruits.add(new FruitEntity());

// does not work
FruitBasket basket = mapper.map(basketEntity, FruitBasket.class);

Исходный код здесь .

...