Spring CrudRepository .orElseThrow()
Posted
技术标签:
【中文标题】Spring CrudRepository .orElseThrow()【英文标题】: 【发布时间】:2014-12-30 21:50:49 【问题描述】:如果数据库查询返回空,抛出异常的正确方法是什么?我正在尝试使用 .orElseThrow()
方法,但它不会编译:
Meeting meeting = meetingRepository.findByMeetingId(meetingId).orElseThrow(new MeetingDoesNotExistException(meetingId));
编译器说:
“Optional类型中的方法orElseThrow(Supplier)不适用于参数(MeetingRestController.MeetingDoesNotExistException)
是否可以使用 lambda 表达式来做到这一点?
CrudRepository:
import java.util.Optional;
import org.springframework.data.repository.CrudRepository;
public interface MeetingRepository extends CrudRepository<Meeting, Long>
Optional<Meeting> findByMeetingId(Long id);
例外:
@ResponseStatus(HttpStatus.CONFLICT) // 409
class MeetingDoesNotExistException extends RuntimeException
public MeetingDoesNotExistException(long meetingId)
super("Meeting " + meetingId + " does not exist.");
【问题讨论】:
【参考方案1】:尝试传递 Supplier<MeetingDoesNotExistException>
类型的 lambda 表达式:
Meeting meeting =
meetingRepository.findByMeetingId(meetingId)
.orElseThrow(() -> new MeetingDoesNotExistException(meetingId));
【讨论】:
@Eran 你能解释一下这个问题吗? ***.com/questions/56180844/…【参考方案2】:错误就是它所说的。
orElseThrow
的文档指出它采用 Supplier
作为参数。
您已声明您的例外是RuntimeException
,而不是Supplier
。因此,orElseThrow()
不适用于该参数类型。您必须将其传递给 Supplier
,而不是 RuntimeException
。
使用 lambda 表达式会更简单的语法。
【讨论】:
以上是关于Spring CrudRepository .orElseThrow()的主要内容,如果未能解决你的问题,请参考以下文章
Spring data : CrudRepository 的保存方法和更新
通过 HTTP 保护 Spring Data RepositoryRestResource (CrudRepository),但不在内部
Spring CrudRepository deleteAll()什么都不做