2014-11-04 16 views
6

Veritabanı sorgusu boşalırsa bir istisna atmanın uygun yolu nedir? Ben .orElseThrow() yöntemi kullanmaya çalışıyorum ama derleme olmaz:Spring CrudRepository .orElseThrow()

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

derleyici söylüyor:

"diye orElseThrow Opsiyonel tip (Tedarikçi) için geçerli değildir yöntem argümanlar (MeetingRestController.MeetingDoesNotExistException)

mümkün lambda ifadeleri kullanarak gerçekleştirmek için mi?

Cr udRepository:

import java.util.Optional; 

import org.springframework.data.repository.CrudRepository; 

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

İstisna:

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

cevap

21

tip Supplier<MeetingDoesNotExistException> bir lambda deyimi geçirerek deneyin:

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

Çalışıyor! Teşekkürler! – szxnyc

0

hata ne anlama geldiği açıktır.

orElseThrow belgeleri, bir parametre olarak bir Supplier aldığını belirtir.

Kural dışı durumunuzu Supplier numaralı RuntimeException olduğu belirtilmiştir. Bu nedenle, orElseThrow() bu argüman türüne uygulanamaz. Bir Supplier, RuntimeException değil. Bir lambda ifadesi kullanmak daha basit bir sözdizimi olurdu.