使用Kotlin擴充套件函式擴充套件Spring Data案例

banq發表於2021-11-11

在使用Spring Data和 Kotlin 時,您可能已經注意到預設findById返回一個Optional<T>. 這篇超短文將向您展示如何利用 Kotlin擴充套件函式來自定義此邏輯。

Optional在 Java 8 中引入作為處理可空性的解決方案。它充當可能包含值的容器,使您免於使用null來表示可選定義。

Kotlin 使用不同的方法解決這個問題:null-safe

Kotlin擴充套件函式允許您使用附加功能擴充套件類,而無需使用裝飾器或直接訪問修改類。當您想向第三方庫新增東西時,它們會非常有用,就好像該函式是庫的一部分一樣。

 

Spring Data 在 2.1.4 中新增了一個擴充套件函式來CrudRepository呼叫findByIdOrNull. 但是,此方法在其他一些介面中不起作用,例如JpaSpecificationExecutor.

這是我用來包裝JpaSpecificationExecutor的一個findOne方法:

/**
 * By default [JpaSpecificationExecutor.findOne] returns an Optional. This extension function wraps it to return a nullable instead.
 */
fun <T> JpaSpecificationExecutor<T>.findOneOrNull(specification: Specification<T>): T? =
  findOne(specification)
  .orElse(null)

通過定義這個擴充套件函式,我現在可以完全繞過Optional並直接使用可為空的返回值:

// Finding a single user using a specification
val filteredUser = userRepository.findOne(specification).orElseThrow { UserNotFoundException() }

// Finding a single user using a specification with nullable
val filteredUser = userRepository.findOneOrNull(specification) ?: throw UserNotFoundException()

 

相關文章