这是完整的代码:
package com.example.controller
import spray.routing.{HttpService, Route}
import spray.http.StatusCodes
import scala.util.{Failure, Success}
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
trait RentController extends HttpService{
var books: List[String] = List("1","2","3","4")
def rentBook(intNum: Int): Future[Unit] = Future[Unit] {
val book = books.find(p => p.equals(intNum.toString))
if(book.head.equals("4")) throw new UnsupportedOperationException()
}
def giveBackBook(intNum: Int): String = {
val book = books.find(p => p.equals(intNum.toString))
book.head
}
val rent: Route =
pathPrefix("rent") {
path("book" / IntNumber) { intNum =>
get {
onComplete(rentBook(intNum)) {
case Success(_) => complete(StatusCodes.OK)
case Failure(_) => complete(StatusCodes.Accepted)
}
}
}
}
val giveBack: Route =
pathPrefix("giveBack") {
path("book" / IntNumber) { intNum =>
get {
onSuccess(Future.successful(giveBackBook(intNum))) {
extraction: String => complete(extraction)
}
}
}
}
}
奇怪的是,他只强调OnSuccess,但OnComplete对他来说显然是正确的。代码有效,但我想知道我是否可能在某处犯了一些错误。所以请告诉我是否缺少一些导入,或者只是IntelliJ bug。
我改变了代码,现在函数rendBook和giveBackBook在逻辑上并不正确,并且做得不多,但你应该很容易重现它
答案 0 :(得分:0)
这是IntelliJ的Scala插件中的a bug - 过度使用implicits可能会让你在那里。如果您了解磁体模式 - 这也是Spray uses,它需要大量的隐式转换来克服Scala中的一些超载限制。
当我使用磁铁模式实现某些功能时,我遇到了这个问题,所以不仅使用Spray - 一些代码加下划线,而其余部分没有,但无论如何都有用。