2014-11-04 63 views
6

如果数据库查询返回空值,那么抛出异常的正确方法是什么?我试图用.orElseThrow()方法,但它不会编译:Spring CrudRepository .orElseThrow()

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

编译器说:

“他法orElseThrow(供应商)在类型可选不适用于参数(MeetingRestController.MeetingDoesNotExistException)

是否有可能与lambda表达式做到这一点?

铬udRepository:

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."); 
    } 
} 

回答

21

尝试通过Supplier<MeetingDoesNotExistException>类型的lambda表达式:

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

工作!谢谢! – szxnyc 2014-11-04 04:36:39

0

错误说话是算数的。

orElseThrow的文档声明以Supplier作为参数。

你已经声明你的例外是RuntimeException,这不是Supplier。因此,orElseThrow()不适用于该参数类型。你将不得不通过它Supplier,而不是RuntimeException

使用lambda表达式会更简单。

相关问题