2014-12-24 3 views
1

Я использую спрей, чтобы выставить спокойное обслуживание. поскольку в большинстве сервисов есть общий шаблон, поэтому я использую «&» для создания псевдонима для него. как следующее:Как скомбинировать часто используемый шаблон пути с использованием «&» в спрее

def getPath(path1: String) = path(path1) & get & detach() & complete 

этот код записывается внутри признака MyService простирается HTTPService с Json4sSupport, если вы пытаетесь скомпилировать его отдельно, вы, возможно, придется писать как этот

def getPath(path1: String)(implicit ec: ExecutionContext) = path(path1) & spray.routing.Directives.get & detach() & complete 

и использовать его в маршрут легко:

~ getPath("person2") { xxx } 
//works as 
//path("person1") { 
//  get { 
//   detach() { 
//   complete { 
//    println("receiving request /person1") 
//    something 
//   } 
//   } 
//  } 
//  } 

, но я не знаю, как создать такой же псевдоним сообщение:

path("account"/"transaction") { 
     post { 
      entity(as[TransferRequest]) { transferReq => 
      detach() { 
       complete { 
       //doing transfer 
       } 
      } 
      } 
     } 
     } 

Я попытался

def postPath[T](path1: String) = path(path1) & post & entity(as[T]) & detach() & complete 

, но не работает, ни где, чтобы получить параметр "transferReq". Как определить, что я хочу?

ответ

2

complete не является составной директивой, вынимайте ее, и вы все хорошо. Попробуйте

def postPath[T](path1: String)(implicit um:FromRequestUnmarshaller[T], ec: ExecutionContext): Directive1[T] = 
    path(path1) & post & entity(as[T]) & detach(()) 

то в вашем месте вызова, использовать его как это

import concurrent.ExecutionContext.Implicits.global 

postPath[String]("123").apply { s => 
    complete (s + "abc") 
}