【问题标题】:Spring CrudRepository .orElseThrow()Spring CrudRepository .orElseThrow()
【发布时间】:2014-12-30 21:50:49
【问题描述】:

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

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

编译器说:

“Optional类型中的方法orElseThrow(Supplier)不适用于参数(MeetingRestController.MeetingDoesNotExistException)

是否可以使用 lambda 表达式来做到这一点?

CrudRepository:

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

【问题讨论】:

    标签: java spring java-8 crud spring-boot


    【解决方案1】:

    尝试传递 Supplier&lt;MeetingDoesNotExistException&gt; 类型的 lambda 表达式:

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

    【讨论】:

    【解决方案2】:

    错误就是它所说的。

    orElseThrow 的文档指出它采用 Supplier 作为参数。

    您已声明您的例外是RuntimeException,而不是Supplier。因此,orElseThrow() 不适用于该参数类型。您必须将其传递给 Supplier,而不是 RuntimeException

    使用 lambda 表达式会更简单的语法。

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 2017-07-04
      • 2014-06-13
      • 2017-04-25
      • 2016-07-01
      • 2018-07-12
      • 2017-10-01
      • 2015-06-19
      • 1970-01-01
      相关资源
      最近更新 更多