将列表对象转换为列表对象Dto java的最佳实践

Akz*_*kza 2 java spring entity dto spring-boot

我已经完成了获取所有数据并将对象转换为 objectDto。但是,不知何故,我觉得我的代码还不够好。在这里我需要你的帮助,我需要任何参考/建议来使我的代码更好(在性能方面)。这是我的工作代码:

    @Override
    public List<BookDto> findAll() throws Exception {
        try {
            List<Book> list = bookDao.findAll();
            List<BookDto> listDto = new ArrayList<>();

            for (Book book : list) {
                BookDto bookDto = new BookDto();
                Set<AuthorDto> listAuthorDto = new HashSet<AuthorDto>();
                Set<Author> dataAuthor = new HashSet<Author>();
                book.getAuthor().iterator().forEachRemaining(dataAuthor::add);

                BeanUtils.copyProperties(book, bookDto, "author", "category");
                bookDto.setCategory(book.getCategory().getCategory());

                for (Author author : dataAuthor) {
                    AuthorDto authorDto = new AuthorDto();
                    BeanUtils.copyProperties(author, authorDto);
                    listAuthorDto.add(authorDto);
                }

                bookDto.setAuthor(listAuthorDto);
                listDto.add(bookDto);
            }
            return listDto;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我需要的输出(已经用上面的代码实现了):

[
    {
        "title": "book1",
        "year": "2013",
        "author": [
            {
                "name": "john",
                "address": "NY"
            },
            {
                "name": "angel",
                "address": "LA"
            }
        ],
        "category": "science"
    },
    {
        "title": "book2",
        "year": "2014",
        "author": [
            {
                "name": "john",
                "address": "NY"
            }
        ],
        "category": "science"
    },
    {
        "title": "book3",
        "year": "2009",
        "author": [
            {
                "name": "angel",
                "address": "LA"
            }
        ],
        "category": "comedy"
    }
]
Run Code Online (Sandbox Code Playgroud)

cнŝ*_*ŝdk 5

与其重新发明轮子并自己编写它,不如使用为此而设计的现有库/工具。

我建议使用ModelMapper,这是一个很好的 DTO/实体映射库,您只需要一行代码即可将您的实体转换为 DTO,例如:

ModelMapper modelMapper = new ModelMapper();
BookDto bookDTO = modelMapper.map(book, BookDto.class);
Run Code Online (Sandbox Code Playgroud)

您可以查看库的示例页面Spring REST API教程实体到 DTO 转换以更深入地了解该库。

  • 我更喜欢mapstruct,因为可以在映射和代码后处理之后看到代码生成的结果。 (2认同)