Optional 返回值为 null 时不抛异常

我正在学习 Spring Boot,当服务在数据库中找不到项目时,我试图抛出异常,因此,我尝试使用可选的,但是当我测试它时,除了异常之外,我只得到一个空响应


    @GetMapping(value = "/compras", produces = "application/json")

public Optional<Compras> retrieveAllCompras(@RequestParam String id) {

    return Optional.of(compraRepository.findById(id)).orElseThrow(RuntimeException::new);

当在数据库中找不到该项目时,我希望出现异常


开满天机
浏览 151回答 4
4回答

婷婷同学_

Optional.of期望纯值。您也可以在文档中找到信息,/** * Constructs an instance with the described value. * * @param value the non-{@code null} value to describe * @throws NullPointerException if value is {@code null} */private Optional(T value) {    this.value = Objects.requireNonNull(value);}例子,jshell> Optional.of(100)$2 ==> Optional[100]jshell> Optional.of(null)|  Exception java.lang.NullPointerException|        at Objects.requireNonNull (Objects.java:221)|        at Optional.<init> (Optional.java:107)|        at Optional.of (Optional.java:120)|        at (#1:1)如果您的价值可能null在运行时,您可以使用.ofNullable,jshell> Optional.ofNullable(null)$3 ==> Optional.emptyALSO 函数式编程的思想是为所有输入返回一个值,而不是抛出Exception破坏函数组合的值。jshell> Function<Integer, Optional<Integer>> f = x -> Optional.of(x + 1)f ==> $Lambda$23/0x0000000801171c40@6996db8jshell> Function<Integer, Optional<Integer>> g = x -> Optional.of(x * 2)g ==> $Lambda$24/0x0000000801172840@7fbe847cjshell> f.apply(5).flatMap(x -> g.apply(x))$13 ==> Optional[12]因此,在您的示例中,您可以将Optional.empty()其视为未找到的项目,但 Spring 也会考虑这一点,200这仍然比 throw 更好500。您可能希望发送404准确。@GetMapping(  value = "/compras",   produces = "application/json")public Optional<Compras> retrieveAllCompras(@RequestParam String id) {    return Optional.ofNullable(compraRepository.findById(id)); //will response as 200 even when no item found}您可以用来ResponseEntity<A>设置特定的 http 状态传统的响应方式404是定义特定的异常。import org.springframework.web.server.ResponseStatusException;import org.springframework.http.HttpStatus;@GetMapping(  value = "/compras",   produces = "application/json")public Compras retrieveAllCompras(@RequestParam String id) {    return Optional.ofNullable(compraRepository.findById(id))                   .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "item not found"))}

慕妹3242003

想想这里的类型,如果你要返回Optional,你会做一个.orElse,你必须重新包装它。这将是一种方法:&nbsp;@GetMapping(value = "/compras", produces = "application/json")public Optional<Compras> retrieveAllCompras(@RequestParam String id) {&nbsp; &nbsp; return Optional.ofNullable(compraRepository.findById(id)).&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;map(Optional::of).&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orElseThrow(() -> new RuntimeException("Not found"));我会解释:Optional.ofNullable()将返回一个Optional<Compras>, 具有值Optional("some compras")或值Optional.Emptymap(Optional::of)将再次包装可选的,所以你将拥有Optional[Optional<Compras>]或(这里的技巧)Optional.Empty,因为地图不包装 Optional.Empty(这是他加入我们的原因)最后,orElseThrow(() -> new RuntimeException("Not found"))将解压你的可选,在这种情况下从Optional[Optional<Compras>]到Optional<Compras>或者,如果是Optional.Empty它将抛出异常

翻过高山走不出你

你的控制器返回Optional<Compras>。这意味着不会#get调用方法。如果值,您的控制器将返回 null&nbsp;Optional。更改为:public Compras retrieveAllCompras...你会得到你的例外

青春有我

从对象名称和调用的方法 ( compraRepository.findById(id)) 来看,您的服务实际上是一个存储库。如果它是 Spring Data 存储库,那么您应该将创建留给OptionalSpring Data: Null Handling of Repository Methods。所以你会有compraRepository.findById(id).orElseThrow(NotFoundException::new)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java