Spring CrudRepository .orElseThrow()

2022-09-01 19:56:51

如果数据库查询返回空,引发异常的正确方法是什么?我正在尝试使用该方法,但它不会编译:.orElseThrow()

Meeting meeting = meetingRepository.findByMeetingId(meetingId).orElseThrow(new MeetingDoesNotExistException(meetingId));

编译器在说:

“he method orElseThrow(Supplier) 在 Type Optional 中不适用于参数 (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

尝试传递类型的 lambda 表达式:Supplier<MeetingDoesNotExistException>

Meeting meeting = 
    meetingRepository.findByMeetingId(meetingId)
                     .orElseThrow(() -> new MeetingDoesNotExistException(meetingId));

答案 2

错误意味着它所说的。

orElseThrow 的文档指出,它采用 a 作为参数。Supplier

您已经声明您的例外是 ,它不是 .因此,不适用于该参数类型。您必须将其传递给 一个 ,而不是 一个 。RuntimeExceptionSupplierorElseThrow()SupplierRuntimeException

使用 lambda 表达式会更简单的语法。


推荐