使用Kotlin扩展函数扩展Spring Data案例


在使用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()