ModelMapper, mapping list of Entites to List of DTO objects

前端 未结 5 1196
深忆病人
深忆病人 2021-02-01 23:49

I am writing simple blog web application using Spring MVC framework. I am willing to add DTO layer to my app.

I decided to use ModelMapper framework for con

相关标签:
5条回答
  • 2021-02-02 00:00

    You can create util class:

    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;
        }
    }
    

    And use it for your needs:

    List<PostDTO> listOfPostDTO = ObjectMapperUtils.mapAll(listOfPosts, PostDTO.class);
    
    0 讨论(0)
  • 2021-02-02 00:06

    considering you have a list of Post Entity (postEntityList) and a PostDTO class, you can try following:

    use the following imports to get the desired results

    import org.modelmapper.ModelMapper;
    import org.modelmapper.TypeToken;
    import java.lang.reflect.Type;
    

    use the below code

    Type listType = new TypeToken<List<PostDTO>>(){}.getType();
    List<PostDTO> postDtoList = modelmapper.map(postEntityList,listType);
    
    0 讨论(0)
  • 2021-02-02 00:13

    Let's assume you are reading from the database, and want to convert from entities in the DB to DTOs

    The service layer might be separated from the controller (always the best approach), then do this:

    Service layer code:

    @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;
            }
    

    Then in your controller, add this:

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

    Note that the iPost is an interface that defines method. This is it:

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

    Credits to @André Carvalho

    0 讨论(0)
  • 2021-02-02 00:14

    Try the following simple way:

    List<PostDTO> postDtoList = Arrays.asList(modelMapper.map(postEntityList, PostDTO[].class));
    
    0 讨论(0)
  • 2021-02-02 00:17

    since you want to convert Entity to Dto, you can try the following one

    List<PostDTO> entityToDto = modelMapper.map(postEntity, new TypeToken<List<PostDTO>>(){}.getType());
    
    0 讨论(0)
提交回复
热议问题