Spring CrudRepository .orElseThrow()

时间:2014-11-04 04:31:51

标签: java spring java-8 crud spring-boot

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

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

编译器说:

  

“自选类型中的方法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.");
  }
}

2 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:1)

错误意味着它所说的内容。

orElseThrow的文档声明它需要Supplier作为参数。

您已声明您的例外情况为RuntimeException,而不是Supplier。因此,orElseThrow()不适用于该参数类型。您必须传递Supplier,而不是RuntimeException

使用lambda表达式会更简单。