Spring Data JPA findById()方法返回null而不是Empty可选

时间:2018-06-27 09:16:16

标签: java spring spring-data-jpa optional

我有一个利用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 的值为空。 这是一段失败的代码。我正在使用Spring Data JPA 2.0.8.RELEASE。请帮助

3 个答案:

答案 0 :(得分:1)

您的存储库类的实现是什么?以下存储库和测试用例对我有用。

@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonRepoTest {

    @Autowired
    private PersonRepository personRepository;

    @Test
    public void testFindById(){
        Optional<Person> byId = personRepository.findById(1);
        Assert.assertTrue(byId != null);
    }
}

public interface PersonRepository  extends CrudRepository<Person, Integer> {
}

答案 1 :(得分:1)

在注释中,您声明这是在具有模拟依赖项的测试中。该模拟完全使Spring Data JPA脱颖而出,因为它现在只是由Mockito的模拟实现的代理。

模拟的默认行为是返回null

  

默认情况下,对于所有返回值的方法,模拟将酌情返回null,原始/原始包装器值或空集合。例如,对于int / Integer为0,对于boolean / Boolean为false。

在运行模拟程序时,您将需要指示它返回Optional.empty(),否则您将获得null

注意:对于Optional.empty返回类型,您可能想创建一个改进请求,以使Mockito默认返回Optional

答案 2 :(得分:-3)

代码行

可选op = ticketEntityRepository.findById(ticket);

如果系统中存在数据,则返回结果集列表,否则很明显它将返回null而不是空的optional。 如果您需要一个空白的可选列表,可以按照以下说明进行扭曲

列表op = ticketEntityRepository.findById(ticket).orElse(new ArrayList());