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

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

邹誉
2023-03-14

我有一个使用Spring数据的方法,JPA的findById()方法应该返回一个可选的。但是,如果指定的id找不到实体,它将返回null而不是空的可选项。

 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数据JPA 2.0.8。释放。请帮忙

共有3个答案

凌照
2023-03-14

代码行

可选op=tickettentyrepository。findById(票证);

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

List op=tickettentyrepository。findById(票证)。orElse(新ArrayList());

卢涵畅
2023-03-14

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

@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> {
}
庄欣然
2023-03-14

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

mock的默认行为是返回null

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

当您使用模拟运行时,需要指示它返回一个可选的。empty()否则将得到null。

注意:您可能希望为Mockito创建一个改进请求,以默认返回可选。如果是可选的返回类型,则为空。

 类似资料:
  • 代码段用于获取从文本文件中提取的一行文本,将其分离为单独的标记,并将每个标记存储在数组的索引中。起初我以为问题出在文本文件上,但是直接将字符串放入编辑器并不能解决这个问题。 使用字符串,如: 带分隔符的StringTokenizer对象返回前四个标记作为正确的字符串,但其余四个标记为null。 有趣的是,另一个字符串: “Gnollnonegeralany222taunttaunt” 鸡肉没有野兽

  • 问题内容: 如果没有行,都与正在返回 空 一个,而不是列表值。 这背后的原因是什么? 问题答案: 原因是不与有效Java 2nd Edition,项目43 一致,在客户端代码中强制执行空检查: 返回空数组或集合,而不是null 。 这使客户端代码更简单,更不易出错(并且很可能也是该方法的实现)。 空返回惯用语可能是C编程语言的一种保留,在C语言中,数组长度与实际数组分开返回。在C中,如果返回零作为

  • 问题内容: 我正在使用Oracle 11GR2,并且当varchar2字段为空时,在空字段上执行a 将显示在我的Eclipse控制台上。如何让它显示空字符串呢? 问题答案: 你的getter方法:

  • 问题内容: 我有这样的代码来使用读取文本文件: 它可以正常工作,但是Findbugs报告警告: NP_DEREFERENCE_OF_READLINE_VALUE:取消引用调用readLine()的结果,而不检查结果是否为null。如果没有更多的文本行要读取,则readLine()将返回null,并取消引用将生成一个null指针异常。 当我更改为时,即 该方法返回而该方法始终返回-实际上这是一个无限

  • 我有一个项目,其中我创建了一个BankAccount超级类和一个SavingsAccount子类。一切都很好,但我在返回我特别想要的字符串时遇到了麻烦。 示例:(裁剪) 驱动程序类将对BankAccount使用toString方法,并打印以下内容: (这对于这个超类来说是完美的) 但是,下面是SavingsAccount子类 调用SavingsAccount的toString方法时,它会打印: S

  • 我试图模拟一些方法调用,但不幸的是我一直返回null。你能帮我指出我可能出错的地方吗?我正在使用time(). thenBack(),我觉得我正确地模拟了返回变量。事先非常感谢。我是JUnit和Mockito的新手,所以如果我错过了任何明显的东西,我很抱歉。 ServiceTest.java Service.java