Я пытаюсь реализовать сеансы «на основе запросов» в scalquery в игровой среде. Я создаю сеанс с помощью scalaquery и пытаюсь сохранить его в текущем контексте http следующим образом:
def withTransaction[A](bp: BodyParser[A])(f: Request[A] => Result): Action[A] = {
Action(bp) {
request =>
val context = Http.Context.current()
val session = createSession()
session.conn.setAutoCommit(false)
context.args.put("scalaquery.session", session)
try {
val result = f(request)
session.conn.commit()
result
}
catch {
case t: Throwable =>
session.conn.rollback()
throw t
}
finally {
session.close()
context.args.remove("scalaquery.session")
}
}
}
затем я оборачиваю свои действия в свои контроллеры, например:
withTransaction(parse.anyContent) {
Action {
//code that produces a result here
}
}
Однако он вылетает в следующей строке:
val context = Http.Context.current()
[RuntimeException: There is no HTTP Context available from here.]
Итак, почему контекст недоступен? Этот код вызывается непосредственно фреймворком, поэтому не должен ли контекст устанавливаться к моменту выполнения этого кода? Или я использую неправильный способ доступа к контексту?
РЕДАКТИРОВАТЬ: «Сеанс» имеет тип org.scalaquery.session.Session. Причина, по которой я хочу установить его в HttpContext, заключается в том, чтобы завернутые действия могли получить к нему доступ в режиме «http-scoped», т.е. чтобы каждый запрос хранил свой сеанс отдельно, но все службы, которым нужен сеанс, могут найти его в общедоступном область, которая отделяется для каждого запроса.