当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot ConversionService将检索到的实体对象列表转换为DTO对象列表的正确方法是什么?

毛淳
2023-03-14

我正在开发一个Spring启动应用程序,我有以下疑问。

我有一个服务方法(工作正常),它将一个对象插入数据库,调用存储库:

@Override
@Transactional
public CoinDTO createCoin(CoinDTO coin) throws DuplicateException {
    Coin checkCoinExists = coinRepository.findByCode(coin.getCode());

    if (checkCoinExists != null) {
        String MsgErr = String.format("Coin %s already registered in the system !!! "
                + "Impossible to use POST", coin.getCode());

        log.warning(MsgErr);

        throw new DuplicateException(MsgErr);
    }

    Coin result = coinRepository.save(conversionService.convert(coin,Coin.class));
    return conversionService.convert(result,CoinDTO.class);
}

如您所见,save()methjod返回插入的Coin对象(即映射我的表的Hibernate实体类)。服务方法将此Coin对象转换为CoinDTO对象,以便返回DTO对象而不是实体实例。它工作正常,这是预期的行为。

现在我创建了第二个服务方法,它只是检索所有Coin对象的列表,并且必须返回相关CoinDTO对象的列表:

@Override
public List<CoinDTO> getCoinList() {
    
    List<Coin> coinsList = this.coinRepository.findAll();
    
    return null;
}

在这里,我有以下疑问:我认为我可以实现thid ENTITY到DTO转换行为,在coinsList元素上迭代,逐个转换列表中的每个元素,然后将其添加到一个新的列表中。它应该能行

有没有更现代、更聪明的方法?也许使用lambda函数?你能帮助我以一种现代而聪明的方式实施这种行为吗?

共有2个答案

丁学
2023-03-14

据我所知,您正在寻找一种使转换过程更短、更方便的方法。如果在本例中使用ModelMapper类,请阅读以下内容http://modelmapper.org/在文档中,ModelMapper使用TypeToken来允许映射泛型参数化类型。

齐高阳
2023-03-14

您可以创建一个通用抽象类,如下所示:

public abstract class AbstractConverter<T, DTO> {
    public abstract T fromDto(DTO dto);

    public abstract DTO toDTO(T t);

    public List<T> fromDTOs(List<DTO> dtos) {
        if (dtos == null || dtos.isEmpty()) {
            return null;
        } else {
            return dtos.stream().map(this::fromDTO).collect(Collectors.toList());
        }
    }

    public List<DTO> toDTOs(List<T> ts) {
        if (ts == null || ts.isEmpty()) {
            return null;
        } else {
            return ts.stream().map(this::toDTO).collect(Collectors.toList());
        }
    }

}

然后创建另一个类,通过像这样分配你想要的值来实现一个重新创建的抽象类:

@Component(value = "coinConverter")
public class CoinConverter extends AbstractConverter<Coin, CoinDTO> {

    @Override
    public Coin fromDTO(CoinDTO dto) {
        if (dto == null) {
            return null;
        } else {
            Coin coin = new Coin();
            // Assign all values you wanted to consume
            // of the following form
            // coin.setYourAttribite(dto.getYourAttribute())
            return coin;
        }
    }

    @Override
    public CoinDTO toDTO(Coin coin) {
        if (t == null) {
            return null;
        } else {
            CoinDTO coinDTO = new CoinDTO();
            // Assign all values you wanted to expose
            // of the following form
            // coinDTO.setYourAttribite(coin.getYourAttribute())
            return coinDTO;
        }
    }
}

在控制器层中,您可以通过以下方式更改现有代码:

@Autowired
@Qualifier("coinConverter")
AbstractConverter<Coin, CoinDTO> abstractConverter;

@Override
public List<CoinDTO> getCoinList() {

    List<Coin> coinsList = this.coinRepository.findAll();
    return abstractConverter.toDTOs(cointList);
}

这样,您的代码可以灵活地添加更多转换器,而无需更改现有转换器。

 类似资料:
  • 问题内容: 我正在使用Spring MVC框架编写简单的博客Web应用程序。我愿意为我的应用添加图层。 我决定使用ModelMapper框架从对象转换为视图中使用的对象。 我只有一个问题。在我的主页上,我正在显示博客中的帖子列表。在我看来,这只是(实体)对象的列表。我想更改它以将对象列表传递给我的视图。有没有什么办法来映射的对象的单方法调用的对象?我当时在考虑编写将对此进行转换的转换器,但是我不确

  • 问题内容: 我想使用Java 8技巧在一行中执行以下操作。 给定此对象定义: 和a ,我想得到a ,它是第一个列表中所有s对象的列表- 顺序相同。 我可以使用Java中的循环来做到这一点,但我相信Java8中应该有一个单行lambda可以做到这一点。我无法在线找到解决方案。也许我没有使用正确的搜索词。 有人可以为这种转换建议一个lambda或另一种线吗? 问题答案: 这应该可以解决问题: 也就是说

  • 我可以在Java中使用循环来实现这一点,但我认为在Java8中应该有一个一行程序lambda来实现这一点。我无法在网上找到解决方案。也许我没有使用正确的搜索词。 有人能为这个转换提出一个lambda或另一个一行程序吗?

  • 我有一个DTO列表,我需要将这个DTO映射到两个不同的实体对象列表。我不熟悉Java和Springboot。我找到了两个DTO映射到一个实体对象的示例。例如http://modelmapper.org/getting-started/ 个人实体- 地址实体- DTO: 我需要将上面的DTO列表映射到下面的实体对象列表: 我如何映射一个列表的人的DTO到列表的人和列表的地址?

  • 问题内容: 我有一个代表列表的字符串: 我想把那些乱七八糟的字符串变成一个实际的清单。我想可以将数字进行正则表达式并循环到(),但是有没有更简单的方法?不知道如何将其设置为正则表达式。 问题答案: 使用ast.literal_eval。

  • 问题内容: 我有SourceObjects列表,我需要将其转换为ResultObjects列表。 我可以使用ResultObject的方法将一个对象获取到另一个对象: 我当然可以这样: 但对于能够展示如何使用 rxJava 进行相同操作的人,我将非常感激。 问题答案: 如果发出,则可以使用以下运算符: (将您的列表转换为可观察项) (将您的商品转换为其他商品) 运算符(将完成的Observable