2014-11-04 10 views
6

Jaki jest właściwy sposób zgłaszania wyjątku, jeśli zapytanie w bazie danych wraca puste? Próbuję użyć metody .orElseThrow() ale nie będzie skompilować:Spring CrudRepository .lubElseThrow()

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

Kompilator mówi:

„on metoda orElseThrow (Dostawca) w rodzaju fakultatywnego nie ma zastosowania do argumenty (MeetingRestController.MeetingDoesNotExistException)

Czy można to zrobić z wyrażeń lambda?

Kr udRepository:

import java.util.Optional; 

import org.springframework.data.repository.CrudRepository; 

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

Wyjątek:

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

Odpowiedz

21

Spróbuj przejściu wyrażenia lambda typu Supplier<MeetingDoesNotExistException>:

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

Pracowałem! dzięki! – szxnyc

0

Błąd oznacza to, co mówi.

W dokumentacji dla orElseThrow podano, że jako parametr przyjmuje on Supplier.

Podałeś swój wyjątek: RuntimeException, który nie jest Supplier. Dlatego orElseThrow() nie ma zastosowania do tego typu argumentu. Musisz przekazać to Supplier, a nie RuntimeException.

Byłoby prostszą składnią do użycia wyrażenia lambda.

Powiązane problemy