2015-08-10 9 views
0

У меня есть следующий фрагмент кода, где dataService возвращает параметр [LocationDataResult]. Я хотел бы установить NotFound, когда dataService возвращает None и отправит данные обратно в случае Some (...).Можно ли установить код ответа от Marshaller в spray.io?

У меня есть следующий код:

val route: Route = { 
    pathPrefix("service"/"data") { 
     pathPrefix("infobox") { 
     get { 
      parameters(('mes.as[String], 'oks.as[String])) { 
      (me, okr) => 

       val resp = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult] 
       .map(remapInfoboxToResponseObject(_)).map { r => 
       r match { 
        case None => StatusCodes.NotFound 
        case Some(dataToRespond) => dataToRespond 
       } 
       } 

       complete { 
       resp 
       } 
      } 
     } 
     } 
    } 
    } 


    implicit val responseMarhaller: Marshaller[LocationInfobox] = Marshaller.of[WikiLocationInfobox](ContentTypes.`application/json`) { (value, contentType, ctx) => 
    val result: String = mapper.writeValueAsString(value) 
    ctx.marshalTo(HttpEntity(contentType, result)) 
    } 

Я не могу найти правильный путь от ИАС и от маршрута через полной функции я не могу заставить его работать.

Может ли кто-нибудь более опытный дать мне подсказку? Не хватает ли здесь какой-то важной концепции?

Thx

UPDATE: Сообщение об ошибке»Выражение типа будущего [Объект] не соответствует ожидаемому типу ToResponseMarsallable

ответ

0

код выглядит нормально, не уверен, что не работает Попробуйте переписать.. он с директивами Spray для фьючерсов вместо завершения самого будущего:

val locationData = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult] 

onSuccess(locationData.map(remapInfoboxToResponseObject)) { 
    case None => complete(StatusCodes.NotFound) 
    case Some(data) => complete(data) 
} 
0

Это работает для меня, прекрасно воспользовавшись MetaMarshallers

  val resp = dataService.ask(GetocationInfoboxData(me, okr)).mapTo[LocationInfoboxDataResult].map(remapInfoboxToResponseObject(_)).map{ 
      r => 
       r match { 
       case None => Left(StatusCodes.NotFound) 
       case Some(data) => Right(data) 
       } 
      } 
     complete(resp) 

 Смежные вопросы

  • Нет связанных вопросов^_^