2014-11-04 5 views
6

Was ist der richtige Weg, um eine Ausnahme zu werfen, wenn eine Datenbankabfrage leer zurückgibt? Ich versuche, die .orElseThrow() Methode zu verwenden, aber es wird nicht kompilieren:Spring CrudRepository .orElseThrow()

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

Der Compiler sagt:

„er Methode orElseThrow (Lieferant) in dem optionalen Typ ist für die nicht anwendbar Argumente (MeetingRestController.MeetingDoesNotExistException)

Ist es möglich, dies mit Lambda-Ausdrücke zu tun?

Cr udRepository:

import java.util.Optional; 

import org.springframework.data.repository.CrudRepository; 

public interface MeetingRepository extends CrudRepository<Meeting, Long>{ 
    Optional<Meeting> findByMeetingId(Long id); 
} 

Ausnahme:

@ResponseStatus(HttpStatus.CONFLICT) // 409 
class MeetingDoesNotExistException extends RuntimeException{ 
    public MeetingDoesNotExistException(long meetingId){ 
    super("Meeting " + meetingId + " does not exist."); 
    } 
} 

Antwort

21

Versuchen Sie, einen Lambda-Ausdruck vom Typ vorbei Supplier<MeetingDoesNotExistException>:

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

Arbeitete! Vielen Dank! – szxnyc

0

Der Fehler bedeutet, was es sagt.

Die Dokumentation für orElseThrow besagt, dass ein Supplier als Parameter benötigt wird.

Sie haben angegeben, dass Ihre Ausnahme eine RuntimeException ist, die keine Supplier ist. Daher gilt orElseThrow() nicht für diesen Argumenttyp. Sie müssten es eine Supplier, nicht eine RuntimeException übergeben.

Es wäre einfacher Syntax, einen Lambda-Ausdruck zu verwenden.