データベースクエリが空を返した場合に例外をスローする適切な方法は何ですか? .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.");
}
}
タイプSupplier<MeetingDoesNotExistException>
のラムダ式を渡してみてください:
Meeting meeting =
meetingRepository.findByMeetingId(meetingId)
.orElseThrow(() -> new MeetingDoesNotExistException(meetingId));
エラーはそれが言うことを意味します。
orElseThrow
のドキュメントには、Supplier
をパラメーターとして取ると記載されています。
例外はRuntimeException
であり、Supplier
ではないということです。したがって、orElseThrow()
はその引数タイプには適用されません。 Supplier
ではなくRuntimeException
を渡す必要があります。
ラムダ式を使用する方が構文は簡単です。