나는이 가이드의 예를 사용하여 스프레이의 ExceptionHandler를 시도하고있다 :ExceptionHandler가 스프레이 테스트 키트와 함께 작동하지 않습니까?
trait MyService extends HttpService {
val myRoute =
path("") {
get {
complete {
throw new ArithmeticException("Oops, I failed!")
"Hello World"
}
}
}
}
나는 곱슬 요청을 한 경우, 그것은 반환 : 나는 의도적으로이 같은 경로에 ArithmeticException
을 던져 http://spray.io/documentation/1.2.2/spray-routing/key-concepts/exception-handling/
class MyServiceActor extends Actor with MyService {
def actorRefFactory = context
def receive = runRoute(handleExceptions(myExceptionHandler)(myRoute))
implicit def myExceptionHandler(implicit log: LoggingContext) =
ExceptionHandler {
case e: ArithmeticException =>
requestUri { uri =>
complete(InternalServerError, "Bad numbers, bad result!!!")
}
}
}
오류 메시지는 Bad numbers, bad result!!!
입니다. 그러나 Specs2 + spray testkit으로 테스트 할 때 올바른 오류 메시지를 반환하지 않고 기본 500 코드 오류 메시지 There was an internal server error
을 반환합니다. sealRoute
을 사용해도 도움이되지 않습니다.
"Test" in {
Get() ~> sealRoute(myRoute) ~> check {
println(responseAs[String]) // Always print `There was an internal server error.`
ok
}
}
그리고 콘솔에
, 나는 오류 추적을 볼 것입니다 :[ERROR] [07/07/2016 00:31:24.661] [specs2.DefaultExecutionStrategy-1] [ActorSystem(com-example-MyServiceSpec)] Error during processing of request HttpRequest(GET,http://example.com/,List(),Empty,HTTP/1.1)
java.lang.ArithmeticException: Oops, I failed!
at com.example.MyService$$anonfun$1.apply(MyService.scala:62)
at com.example.MyService$$anonfun$1.apply(MyService.scala:61)
at spray.routing.directives.RouteDirectives$$anonfun$complete$1$$anon$3.apply(RouteDirectives.scala:49)
at spray.routing.directives.RouteDirectives$$anonfun$complete$1$$anon$3.apply(RouteDirectives.scala:48)
at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
...
은 내가
myExceptionHandler
에에 println 명령을 넣어 결코 실행되지 얻을 myExceptionHandler을 발견했다.
누구나 왜 작동하지 않는지 알 수 있습니까? 여기에 설명 된대로 예외 핸들러가 암시 적으로 해결되기 때문에
큰 질문입니다! 소화 할 수있는 예제로 분류 해 주셔서 감사합니다. 나는 비슷한 문제를 두 번 만났다. 이 대답은 마침내 나를 도왔습니다 :) – stholzm