23

我正在使用 Spring MVC 框架编写简单的博客 Web 应用程序。我愿意在DTO我的应用程序中添加层。

我决定使用ModelMapper框架将Entity对象转换为DTO视图中使用的对象。

我只有一个问题。在我的主页上,我正在显示我博客上的帖子列表。在我看来,它只是Post(实体)对象的列表。我想更改它以将PostDTO对象列表传递给我的视图。有没有办法通过单一方法调用将对象映射ListPost对象?我正在考虑编写转换器来转换它,但我不确定这是一个好方法。ListPostDTO

此外,我在其他几个地方使用Lists了 of ,例如管理面板或我页面上每个帖子下方的评论。Entities

链接到我在 GitHub 存储库上的应用程序代码:存储库

4

5 回答 5

55

您可以创建 util 类:

public class ObjectMapperUtils {

    private static final ModelMapper 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);
于 2017-12-22T09:42:39.120 回答
33

考虑到您有一个 Post Entity ( postEntityList) 列表和一个 PostDTO 类,您可以尝试以下操作:

使用以下导入来获得所需的结果

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

使用下面的代码

Type listType = new TypeToken<List<PostDTO>>(){}.getType();
List<PostDTO> postDtoList = modelmapper.map(postEntityList,listType);
于 2019-01-30T18:52:12.977 回答
11

尝试以下简单方法:

List<PostDTO> postDtoList = Arrays.asList(modelMapper.map(postEntityList, PostDTO[].class));
于 2019-11-06T04:05:13.640 回答
11

既然你想将Entity转换为Dto,你可以尝试以下一个

List<PostDTO> entityToDto = modelMapper.map(postEntity, new TypeToken<List<PostDTO>>(){}.getType());
于 2019-06-18T04:08:06.007 回答
3

假设您正在从数据库中读取数据,并希望将数据库中的实体转换为 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

于 2019-10-10T14:03:54.637 回答