scala - Play framework 2.0: almacenar valores en Http.Context
playframework httpcontext (1)
Creo que el problema es que estás usando la API de Java con el controlador Scala. Http.Context
solo se establece si está utilizando el controlador de Java. ¿Has considerado usar la API de sesión de Scala ?
Además, otra pregunta es, ¿por qué necesita almacenar la sesión en el contexto? Veo que acaba de quitarlo al final de todos modos. Si lo que necesita es que las acciones secundarias puedan acceder a la sesión, puede simplemente pasarla a la función.
Solo voy a suponer que la session
es de tipo Session
def withTransaction[A](bp: BodyParser[A])(f: Session => Request[A] => Result): Action[A] = {
Action(bp) {
request =>
val session = createSession()
session.conn.setAutoCommit(false)
try {
val result = f(session)(request)
session.conn.commit()
result
}
catch {
case t: Throwable =>
session.conn.rollback()
throw t
}
finally {
session.close()
}
}
}
y sus subacciones serían
withTransaction(parse.anyContent) { session => request =>
//code that produces a result here
}
no es necesario que envuelva esto en Action
ya que ya está envuelto withTransaction
Estoy tratando de implementar sesiones "basadas en solicitud" en scalaquery en el marco de juego. Creo una sesión usando scalaquery e intento almacenarla en el contexto HTTP actual, de la siguiente manera:
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")
}
}
}
luego envuelvo mis acciones en mis controladores como:
withTransaction(parse.anyContent) {
Action {
//code that produces a result here
}
}
Sin embargo, se bloquea en la siguiente línea diciendo:
val context = Http.Context.current()
[RuntimeException: There is no HTTP Context available from here.]
Entonces, ¿por qué el contexto no está disponible? El marco llama directamente a este código, por lo que, ¿no debería establecerse el contexto cuando se ejecuta este código? ¿O estoy usando la forma incorrecta para acceder al contexto?
EDITAR: La "sesión" es de tipo org.scalaquery.session.Session. El motivo por el que quiero configurarlo en HttpContext es para que las acciones envueltas puedan acceder a él en un formato "http scoped", es decir, que cada solicitud almacene su sesión por separado, sin embargo, todos los servicios que necesitan una sesión pueden encontrarla en un servidor público. alcance que está separado por solicitud.