2014-11-04 10 views
6

Qual è il modo corretto di generare un'eccezione se una query di database restituisce vuoto? Sto cercando di utilizzare il metodo .orElseThrow() ma non si compila:Spring CrudRepository .orElseThrow()

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

Il compilatore sta dicendo:

", ha metodo orElseThrow (fornitore) nel tipo opzionale non è applicabile per la argomenti (MeetingRestController.MeetingDoesNotExistException)

E 'possibile farlo con le espressioni lambda?

Cr udRepository:

import java.util.Optional; 

import org.springframework.data.repository.CrudRepository; 

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

Eccezione:

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

risposta

21

Prova a passare un'espressione lambda di tipo Supplier<MeetingDoesNotExistException>:

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

Ha funzionato! Grazie! – szxnyc

0

L'errore significa quello che dice.

La documentazione per orElseThrow indica che è necessario un Supplier come parametro.

Hai dichiarato che la tua eccezione è una RuntimeException, che non è una Supplier. Pertanto, orElseThrow() non è applicabile a tale tipo di argomento. Dovresti passarlo a Supplier, non a RuntimeException.

Sarebbe più semplice sintassi utilizzare un'espressione lambda.