Я занят переносом одного из наших приложений Spring/Groovy на Spray/Scala. Я довольно новичок в Spray, так что простите меня, если это вопрос для начинающих.Перехватчики/фильтры в спрее
Целью является эмулировать наш регистрационный перехватчик, который регистрирует различные данные для каждого запроса/ответа. В этой части кода существует довольно много логики, поэтому это не простая строка журнала. Кроме того, я хотел бы обернуть ВСЕ запросы, которые входят в эту логику.
Существующие Groovy/Spring Interceptor:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler {
//do some logging logic
}
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//do some more logging logic
}
Мой Scala актер выглядит так
class BootServiceActor extends Actor with ViewingController with LazyLogging with ViewingWire {
def actorRefFactory = context
implicit val ctx = context.dispatcher
def receive = runRoute(route)(exceptionHandler, RejectionHandler.Default, context,
RoutingSettings.default, LoggingContext.fromActorRefFactory)
}
Спасибо за ответ - я пытаюсь сделать подход к директиве. Существует DubuggingDirective, который поставляется с Spray, который выводит запрос/ответ, и я пытаюсь скопировать/вставить этот код. У вас есть информация о передаче «типа контекста»/состояния вокруг? Как правило, я мог бы использовать объект threadlocal/request, но я не уверен, что это возможно с помощью Spray? –
Threadlocal не работает, ответ может быть отправлен другим потоком. Вы можете сделать так, как это делает директива для отладки, «mapRequestContext» и внутри нее «withRouteResponseMapped», поэтому данные фактически находятся в закрытии, которое вызывается, когда ответ в итоге произошел, но в этом случае у вас не будет доступа к маршрутам , Если вы хотите получить доступ к нему внутри, вы можете передать его явно (т. Е. Предоставить его из своей директивы); вы можете объявить его неявным и передать его в функции как неявный параметр, чтобы упростить работу. – lmm
Но то, на что я ссылался, является функциональным способом потоковой передачи изменчивого состояния посредством вычисления, [монады государства пламени] (http://eed3si9n.com/learning-scalaz/State.html). Вы можете составлять вместе вычисления, которые работают с состоянием, используя 'for' /' yield' и другие инструменты scalaz (например,'traverse') прекрасно работают на них, а затем вы принимаете директиву' State [MyInfo, Route] 'или некоторые из них. Но это может быть излишним для простого случая. – lmm