2015-04-06 2 views
0

Я играю с Scala Spray. Мне нравится работать с ним, но я не могу разобраться в одном.Получение неявного значения val из объекта-компаньона

Этот код компилируется нормально:

import spray.http.MediaTypes._ 
import spray.routing.HttpService 
import spray.json.{DefaultJsonProtocol, _} 
import spray.httpx.SprayJsonSupport._ 

trait StatusService extends HttpService { 

    case class StatusResponse(status: String) 

    object StatusResponseProtocol extends DefaultJsonProtocol { 
    implicit val statusResponse = jsonFormat1(StatusResponse) 
    } 

    import StatusResponseProtocol._ 

    val statusRoute = 
    path("status") { 
     get { 
     respondWithMediaType(`application/json`) { 
      complete { 
      StatusResponse("OK") 
      } 
     } 
     } 
    } 
} 

Но он не компилируется (не может найти JSon сериалайзер), когда я двигаюсь класс & протокол случая к объекту компаньона.

trait StatusService extends HttpService { 

    import StatusResponseProtocol._ 

    val statusRoute = 
    path("status") { 
     get { 
     respondWithMediaType(`application/json`) { 
      complete { 
      StatusResponse("OK") 
      } 
     } 
     } 
    } 
} 

object StatusService { 

    case class StatusResponse(status: String) 

    object StatusResponseProtocol extends DefaultJsonProtocol { 
    implicit val statusResponse = jsonFormat1(StatusResponse) 
    } 
} 

Я не понимаю, почему ..

ответ

2

Я думаю, что проблема может быть в вашем заявлении импорта. При импорте из объекта-компаньона, это должно быть сделано так:

trait StatusService extends HttpService { 

    import StatusService.StatusResponseProtocol._ 

Остальная часть кода не должен быть изменен.

+0

Это ничего не меняет для меня, к сожалению. – cyrillk

+0

можете ли вы добавить весь вывод из компилятора? – Ashalynd

0

Я думаю, что у меня была такая же проблема. Попробуйте заменить:

import spray.httpx.SprayJsonSupport._ 

с

import spray.json._ 

Он работал для меня.

0

Я заметил сегодня (в другом контексте, а не спрей), что предоставление типа для implicit val в сопутствующем объекте сделало его видимым.

Итак, я имею в виду, будет ли это заставить его работать в вашем случае:

implicit val statusResponse: RootJsonFormat[StatusResponse] = jsonFormat1(StatusResponse) 

Примечание: Я не уверен, что типа я добавил - это не может быть то, что jsonFormat1 возвращается. Кроме того, в документации Spray.json не используются типы. В любом случае, если у кого-то есть время попробовать это, мне было бы интересно узнать ..

+0

Интересно. Спасибо, что поделился! – cyrillk