首页 > 解决方案 > Spring Data JPA findById() 方法返回 null 而不是 Empty 可选

问题描述

我有一个使用 Spring Data JPA 的 findById() 方法的方法应该返回一个 Optional。但是,如果指定的 id 没有找到实体,它会返回null而不是 Empty Optional。

 public TicketEntity findTicket(String ticket) throws EntityNotFoundException {

    Optional<TicketEntity> op = ticketEntityRepository.findById(ticket);

    TicketEntity ticketEntity = op.orElseThrow(() -> new EntityNotFoundException("ticket with the id " + ticket + " not found in the system"));

    return ticketEntity;
}

调试的时候发现op的值为null。这是一段失败的代码。我正在使用 Spring Data JPA 2.0.8.RELEASE。请帮忙

标签: javaspringspring-data-jpaoptional

解决方案


在评论中,您声明这是在带有模拟依赖项的测试中。模拟将 Spring Data JPA 完全排除在外,因为它现在只是由Mockito的模拟实现的代理。

模拟的默认行为是返回null

默认情况下,对于所有返回值的方法,mock 将根据需要返回 null、原始/原始包装器值或空集合。例如 0 表示 int/Integer,false 表示 boolean/Boolean。

当您使用模拟运行时,您需要指示它返回Optional.empty()您将得到的 else null

注意:您可能希望为 Mockito 创建一个改进请求,以在返回类型Optional.empty的情况下默认返回。Optional


推荐阅读