gpt4 book ai didi

java - 500 Internal Server Error 而不是 Spring Boot 中的 404

转载 作者:行者123 更新时间:2023-11-29 08:28:39 25 4
gpt4 key购买 nike

当我试图找出数据库中不存在的值时,我收到 500 内部服务器错误。我已经提供了抛出 ResourceNotFoundException 错误的逻辑,但是由于某种原因它不起作用。我需要做什么才能得到 404 ResourceNotFoundException 而不是 500 Internal Server Error。这是我的代码:

@PostMapping("/start/{id}")
public ResponseEntity<String> startEvent(@PathVariable() Long id) {
Event event = this.eventRepository.findById(id).get();

if (event == null) {
throw new ResourceNotFoundException("Event with id " + id + " not found.");
}

event.setStarted(true);
this.eventRepository.save(event);

return ResponseEntity.ok("Event " + event.getName() + " has started");
}

我猜 eventRepository.findById(id)//id = 200 返回 500 响应,因为数据库中不存在 ID 为 200 的记录。我应该怎么做才能获得 ResourceNotFoundException?

最佳答案

eventRepository.findById 返回 Optional(在 Spring Data JPA 2.0.6 中,参见 https://docs.spring.io/spring-data/jpa/docs/2.0.6.RELEASE/reference/html/#repositories.core-concepts)

Optional.get 空可选导致 NoSuchElementException ( https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#get-- )。您的 if (event == null) 来得太迟了。检查 stactrace,您应该看到异常来自 this.eventRepository.findById 并且实际异常是 NoSuchElementException

要解决这个问题,您应该将代码更改为

    Optional<Event> optionalEvent= this.eventRepository.findById(id);
if (!optionalEvent.isPresent()) {
throw new ResourceNotFoundException("Event with id " + id + " not found.");
}
Event event=optionalEvent.get();
//the rest of your logic

你也可以用更函数式的方式编写你的代码

Event event = this.eventRepository
.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Event with id " + id + " not found."))

总结

不要在Optional 上调用get() 而不检查它是否存在(使用isPresent() 方法)

关于java - 500 Internal Server Error 而不是 Spring Boot 中的 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com