ModelMapper: добавить поле в DTO, которое отсутствует внутри объекта - PullRequest
0 голосов
/ 10 июля 2019

Как я могу отобразить поле DTO, которое не существует в сущности?Я приведу пример, у меня есть два основных класса.Класс DTO, как правило, класс бинов и класс сущностей JPA.Как вы уже догадались, я хочу сопоставить класс сущности с DTO.

@Entity
class Poll {

    @Id
    private Long id;
    private String question;
    private List<Choice> choices;
    private User creator;

    ...
}

* Класс упрощен, его отображение JPA не имеет значения

class PollDTO {

    private Long id;
    private Long question;
    private List<ChoiceDTO> choices;
    private UserDTO creator;

    private Long votes; // This field exists JUST in DTO class

    ...
}

Как видите, DTO содержит поле votes, которого нет внутри сущности, поскольку голоса хранятся в виде отдельной сущности JPA.Таким образом, требуется установить значение вручную, скажем, путем извлечения его из voteService.getVotesForPoll(Long pollId).

Как я могу указать ModelMapper автоматически выбирать и применять это значение при сопоставлении Poll с PollDTO, используяmodelMapper.map(poll, PollDTO.class);?

Я пробовал это с конвертером, и в основном это работает, но затем я должен сопоставить другое поле от Poll до PollDTO, и это указывает на отображение Choice к ChoiceDTO например вручную тоже ... Это мой подход к конвертеру ...

@Configuration
public class MapperConfig {

    @Autowired private VoteService voteService;

    @Bean
    public ModelMapper modelMapper() {

        ModelMapper mapper = new ModelMapper();
        mapper.addConverter(toPollDTO());

        return mapper;
    }

    private Converter<Poll, PollDTO> toPollDTO() {

        return context -> {

            Poll poll = context.getSource();
            PollDTO dto = context.getDestination();

            dto.setVotes(voteService.getVotesForPoll(poll.getId()));
            // But this required mapping other fields manually too or they will be blank

            return dto;
        };
    }
}

* Если вас интересуют какие-то аннотации, я использую Spring Framework прямотеперь, для этого вопроса не имеет значения

...