2016-08-19 5 views
1

aka-http에서 옵션 결과를 반환 할 때 문제가 있습니다. 크게 감상 할 수옵션 결과 akka-http

[error] found : scala.concurrent.Future[akka.http.scaladsl.server.StandardRoute] 
[error] required: akka.http.scaladsl.server.Route 
[error]  (which expands to) akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult] 
[error]  contactService.getById(id).map { 

어떤 도움 :

는 기본적으로 저와의 오차를 제공하는 404

pathPrefix("contacts"/Segment) { id => 
    get { 
     contactService.getById(id).map { 
     case Some(c: ContactDto) => complete(OK -> toResource(c)) 
     case None => complete(HttpResponse(NotFound)) 
     } 
    } 
    } 

을 가질 수는 GET입니다.

답변

0

여기서 볼 수있는 문제는 Future을 사용하고 있으며 Option이 아니기 때문에 발생하는 문제입니다. 전화 contactService.getById(id)Future을 반환한다고 가정합니다. 라우팅 트리 내의 모든 경로의 결과는 RequestContext => Future[RouteResult]의 줄임말 인 Route이어야하고 Future은 자체가 Route이 아니므로이 상황을 처리하려면 약간의 변경 작업이 필요합니다.

pathPrefix("contacts"/Segment) { id => 
    get { 
    val fut = contactService.getById(id) 
    onComplete(fut){ 
     case util.Success(Some(c: ContactDto)) => 
     complete(OK -> toResource(c)) 
     case util.Success(None) => 
     complete(HttpResponse(NotFound)) 
     case util.Failure(ex) => 
     complete(HttpResponse(InternalServerError)) 
    } 
    } 
} 

이 코드는 현재의 (a None과 실패와 더불어, Some로 성공 성공)을 Future에서 3 개 가능한 결과를 처리, 다음과 같이 당신은 당신의 Future과 조합 onComplete 지시어를 사용할 수 있어야합니다 각각의 경우에 대해 Route을 생성합니다. 이렇게하면 문제가 해결됩니다.

0

@ cmbaxter의 답변은 맞지만 위의 세 가지 경우 (Ok, NotFound, InternalServerError)의 표준 상태 코드에 만족하면 Future[Option[T]]을 반환하는 함수로 직접 완료하는 코드를 단순화 할 수 있습니다. toResource 가정된다

pathPrefix("contacts"/Segment) { id => 
    get { 
    complete(contactService.getById(id).map(toResource)) 
    } 
} 

ToEntityMarshaller는 그 함수에 의해 리턴 유형에 존재하는 형태를 반환한다. Akka는 기계 FutureOption을 증명하므로 T 부품 만 제공하면됩니다. 예를 들어 json을 반환하고 spray-json을 사용하는 경우 JsonWriter[T]을 정의 할 수 있으며 akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport에있는 implicits가 나머지 작업을 수행합니다. spray-json-support을 참조하십시오.

map(toResource)은 실제로는 필요하지 않지만 다른 유형으로 ContactDto의 추가 변환을한다고 가정합니다. 단지 json 또는 유사한 것으로 변환하는 경우 드롭 한 다음 내장 마샬링 지원을 다음과 같이 사용할 수 있습니다. 전술 한 바와.