картографирование сервисов mapstruct в коллекции - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть родитель с коллекцией детей, которую я хочу отобразить.

Parent -> Collection<Child> children
ParentDTO -> Collection<ChildDTO> childDTOs

Из DTO в Домен. Мне нужен вызов поиска в базе данных: у меня есть сервисный метод, который ищет дочерний элемент по его идентификатору:

Child getChild(Long id)

Теперь в родительском dtoToDomain (parentDTO) я хочу, чтобы mapstruct выполнила поиск для каждого элемента в коллекции.

Это решение работает для single-occ, mapstruct может найти getChild в сервисе и записывает действие поиска:

@Mapper(uses = ChildService.class)
public interface ParentMapper {

    @Mapping(source="child.id", target="child")
    Parent dtoToDomain(ParentDTO parentDTO);
}

Однако для коллекции мне нужно указать конкретный метод для отображения коллекции, но что я должен добавить в @Mapping? Как то так?

@Mapping(source="child.id", target="child")
Collection<Child> dtoToDomain(Collection<ChildDTO> children)

Я не вижу, как я могу написать реализацию по умолчанию, так как мне нужен сервис, который автоматически подключается реализацией.

Я мог бы представить себе это решение: дочерний маппер, где я переопределяю метод Dto to Domain с помощью вида, подобного этому:

@Mapper(uses = ChildMapper.class)
public interface ParentMapper {

    Parent dtoToDomain(ParentDTO parentDTO);
}

@Mapper(uses = ChildService.class)
public interface ChildMapper {

    @Mapping(source="id", target="")
    Child dtoToDomain(ChildDTO child);
}

Но цель обязательна в mapstruct. Может быть, я могу как-то указать весь объект как цель?

1 Ответ

0 голосов
/ 28 апреля 2018

Полагаю, вы ищете Объектные фабрики .

С помощью @ObjectFactory вы можете создать экземпляр для сопоставления на основе исходного объекта.

Например

public class ChildFactory {


    private final ChildService childService;

    public ChildFactory(ChildService childService) {
        this.childService = childService;
    }


    public Child createChild(ChildDto dto) {
        if (dto.getId() == null) {
            return new Child();
        } else {
            return childService.findById(dto.getId());
        }
    }
}

На данный момент вы можете использовать ChildFactory в вашем ChildMapper. В будущем, вероятно, будет возможно передать завод как @Context. См # 1398

...