2017-05-24 3 views
0

avro에서 사용자 정의 사례 클래스로 이동하는 akka http에 대한 unmarshaller를 만들려고합니다. 그러나 그것은 내게 "애매한 가치를 찾을 수 없다"는 매우 모호한 오류를줍니다. 이것을 디버깅하거나 스칼라로 하여금 문제가있는 곳을 어떻게 생각하게 할 수 있습니까? 나는 또한이 같은 Unmarshaller에 만든 같은 클래스에서akka http의 경로 dsl을 디버깅하는 방법

class MetricsRoute(implicit val system: ActorSystem, implicit val materializer: ActorMaterializer) { 
import system.dispatcher 

    def getRoute() = { 
    path("metrics") { 
     put { 
     decodeRequest { 
      entity(as[Metrics]) { metrics: Metrics => 
      println(metrics.time) 
      complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>hi!</h1>")) 
      } 
     } 
     } 
    } 
    } 

:

나는 다음과 같은 경로를 설정

implicit def avroUnmarshaller(): FromRequestUnmarshaller[Metrics] = 
    Unmarshaller.withMaterializer { 
     implicit ex: ExecutionContext => 
     implicit mat: Materializer => 
     request: HttpRequest => { 
      val inputStream = request.entity.dataBytes.runWith(
      StreamConverters.asInputStream(FiniteDuration(3, TimeUnit.SECONDS)) 
     ) 

      val reader = new SpecificDatumReader[AvroMetrics](classOf[AvroMetrics]) 
      val decoder:BinaryDecoder = DecoderFactory.get().binaryDecoder(inputStream, null) 

      //AvroMetrics is a case class generated from the avro schema 
      val avroMetrics:AvroMetrics = AvroMetrics(0, 0, List()) 
      reader.read(avroMetrics, decoder) 

      Future { 
      //converts the avro case class to the case class specific for my application 
      convertMetrics(avroMetrics) 
      } 
     } 
    } 

을하지만이 나에게주는 암시 찾을 수 없습니다 '매우 모호한 값 '오류 :

[error] /mypath/MetricsRoute.scala:34: could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[my.package.types.Metrics] 
[error]   entity(as[Metrics]) { metrics: Metrics => 
[error]     ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 

누락 된 부분이나 잘못된 부분을 디버깅하는 방법은 무엇입니까?

편집 : 나는 그래서 마샬 코드 자체를 나타낼 것으로 보인다

entity(avroUnmarshaller) { metrics: Metrics => 

entity(as[Metrics]) { metrics: Metrics => 

을 변경, 자신 Unmarshaller에이 수행 작업을 지정할 때

주목할 필요가있다 틀린 것은 아니지만 형식에 문제가 있습니까?

답변

1

컴파일러는 FromRequestUnmarshaller[Metrics]을 찾고 있습니다. 정의한 내용은 () => FromRequestUnmarshaller[Metrics]입니다.

괄호없이 묵시적으로 정의 해보십시오. 대신

implicit def avroUnmarshaller(): FromRequestUnmarshaller[Metrics] = ??? 

implicit def avroUnmarshaller: FromRequestUnmarshaller[Metrics] = ??? 

(또한, 그것은 val을 할 수 있지만,이 문제에 관련이없는의) 많은 이해

+0

아를,. 너무 나쁘면 유형에 명시 적으로 표시되지 않습니다. val over def를 사용하면 어떤 이점이 있습니까? – Xeli

+1

'def'는 호출 될 때마다 새롭게 평가되고,'val'은 한번만 평가됩니다 (https://stackoverflow.com/questions/4437373/use-of-def-val-and-var-in-scala) –