web-dev-qa-db-ja.com

Spring CrudRepository .orElseThrow()

データベースクエリが空を返した場合に例外をスローする適切な方法は何ですか? .orElseThrow()メソッドを使用しようとしていますが、コンパイルできません:

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

コンパイラは言っています:

タイプOptionalのメソッドorElseThrow(Supplier)は引数に適用できません(MeetingRestController.MeetingDoesNotExistException)

ラムダ式でこれを行うことは可能ですか?

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.");
  }
}
12
szxnyc

タイプSupplier<MeetingDoesNotExistException>のラムダ式を渡してみてください:

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

エラーはそれが言うことを意味します。

orElseThrow のドキュメントには、Supplierをパラメーターとして取ると記載されています。

例外はRuntimeExceptionであり、Supplierではないということです。したがって、orElseThrow()はその引数タイプには適用されません。 SupplierではなくRuntimeExceptionを渡す必要があります。

ラムダ式を使用する方が構文は簡単です。

1
Jason C