ModelMapper, отображение списка объектов Entites в список объектов DTO

Я пишу простое веб-приложение для блога, используя Spring MVC Framework. Я готов добавить DTO слой к моему приложению.

Я решил использовать ModelMapper Framework для конвертации из Entity возражает против DTO объекты, используемые в моих взглядах.

У меня только одна проблема. На моей главной странице я показываю список постов в моем блоге. На мой взгляд, это просто список Post (Entity) объекты. Я хочу изменить его, чтобы передать список PostDTO объекты на мой взгляд. Есть ли способ на карте List из Post возражает против List из PostDTO объект с единственным вызовом метода? Я думал о написании конвертера, который преобразует это, но я не уверен, что это хороший способ сделать это.

Также я использую Lists из Entities в нескольких местах, таких как административная панель или комментарий под каждым сообщением на моей странице.

Ссылка на код моего приложения в репозитории GitHub: репозиторий

1 ответ

Решение

Вы можете создать класс утилит:

public class ObjectMapperUtils {

    private static ModelMapper modelMapper = new ModelMapper();

    /**
     * Model mapper property setting are specified in the following block.
     * Default property matching strategy is set to Strict see {@link MatchingStrategies}
     * Custom mappings are added using {@link ModelMapper#addMappings(PropertyMap)}
     */
    static {
        modelMapper = new ModelMapper();
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
    }

    /**
     * Hide from public usage.
     */
    private ObjectMapperUtils() {
    }

    /**
     * <p>Note: outClass object must have default constructor with no arguments</p>
     *
     * @param <D>      type of result object.
     * @param <T>      type of source object to map from.
     * @param entity   entity that needs to be mapped.
     * @param outClass class of result object.
     * @return new object of <code>outClass</code> type.
     */
    public static <D, T> D map(final T entity, Class<D> outClass) {
        return modelMapper.map(entity, outClass);
    }

    /**
     * <p>Note: outClass object must have default constructor with no arguments</p>
     *
     * @param entityList list of entities that needs to be mapped
     * @param outCLass   class of result list element
     * @param <D>        type of objects in result list
     * @param <T>        type of entity in <code>entityList</code>
     * @return list of mapped object with <code><D></code> type.
     */
    public static <D, T> List<D> mapAll(final Collection<T> entityList, Class<D> outCLass) {
        return entityList.stream()
                .map(entity -> map(entity, outCLass))
                .collect(Collectors.toList());
    }

    /**
     * Maps {@code source} to {@code destination}.
     *
     * @param source      object to map from
     * @param destination object to map to
     */
    public static <S, D> D map(final S source, D destination) {
        modelMapper.map(source, destination);
        return destination;
    }
}

И используйте его для своих нужд:

List<PostDTO> listOfPostDTO = ObjectMapperUtils.mapAll(listOfPosts, PostDTO.class);

Учитывая , что у вас есть список Post Entity (postEntityList) и класс PostDTO, вы можете попробовать следующее:

Type listType = new TypeToken<List<PostDTO>>(){}.getType(); List<PostDTO> postDtoList = modelmapper.mapper(postEntityList, listType);

Попробуйте следующий простой способ:

List<PostDTO> postDtoList = Arrays.asList(modelMapper.map(postEntityList, PostDTO[].class));

Так как вы хотите конвертировать Entity в Dto, вы можете попробовать следующий

List<PostDTO> entityToDto = modelMapper.map(postEntity, new TypeToken<List<PostDTO>>(){}.getType());

Предположим, вы читаете данные из базы данных и хотите преобразовать объекты в базе данных в DTO.

Уровень обслуживания может быть отделен от контроллера (всегда лучший подход), затем сделайте следующее:

Код уровня обслуживания:

@Override
    public List<PostDTO> convertEntityToDTOList( ){
            List<Post> post = postRepository.findAll();
            Type listType = new TypeToken<List<PostDTO>>(){}.getType();
            List<PostDTO> postDTOList = modelMapper.map(post, listType);
            return postDTOList;
        }

Затем в вашем контроллере добавьте это:

public ResponseEntity<?> list(){
        List<PostDTO> postDTOList = iPost.convertEntityToDTOList();
        return new ResponseEntity<>(postDTOList, HttpStatus.OK);
    }

Обратите внимание, что iPost - это интерфейс, определяющий метод. Это оно:

public interface iPost {
   List<PostDTO> convertEntityToDTOList();
}

Кредиты @André Carvalho

Другие вопросы по тегам