Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

192
Vistas
¿Cómo usar coroutine dentro del router.route("/api/*").handler?

Estoy tratando de usar coroutine dentro del controlador de ruta lambda de la siguiente manera:

 private suspend fun createRoutes(router: Router, auth: OAuth2Auth): Unit { val oauth2 = OAuth2AuthHandler.create(vertx, auth) val authz = KeycloakAuthorization.create() router.route().handler(LoggerHandler.create()) router.route("/api/*").handler(oauth2) router.route("/api/greet").handler { println(RoleBasedAuthorization.create("ad-admins").match(it.user())) authz.getAuthorizations(it.user()).await() } }

El compilador se queja en authz.getAuthorizations(it.user()).await() acerca de Suspension functions can be called only within coroutine body . ¿Qué estoy haciendo mal?

Todo el código:

 class MainVerticle : CoroutineVerticle() { private suspend fun initConfig(): JsonObject { val yamlConfigOpts = ConfigStoreOptions() .setFormat("yaml") .setType("file") .setConfig(JsonObject().put("path", "config.yaml")) val configRetrieverOpts = ConfigRetrieverOptions() .addStore(yamlConfigOpts) val configRetriever = ConfigRetriever.create(vertx, configRetrieverOpts) return configRetriever.config.await() } private suspend fun createJwtAuth(): OAuth2Auth = KeycloakAuth.discover( vertx, OAuth2Options() .setFlow(OAuth2FlowType.AUTH_CODE) .setClientID("svc") .setClientSecret("9d782e45-67e7-44b1-9b74-864f45f9a18f") .setSite("https://oic.dev.databaker.io/auth/realms/databaker") ).await() private suspend fun createRoutes(router: Router, auth: OAuth2Auth): Unit { val oauth2 = OAuth2AuthHandler.create(vertx, auth) val authz = KeycloakAuthorization.create() router.route().handler(LoggerHandler.create()) router.route("/api/*").handler(oauth2) router.route("/api/greet").handler { println(RoleBasedAuthorization.create("ad-admins").match(it.user())) authz.getAuthorizations(it.user()).await() } } private suspend fun server(router: Router): HttpServer { val server = vertx.createHttpServer() return server.requestHandler(router) .listen(8080) .onSuccess { println("HTTP server started on port ${it.actualPort()}") } .onFailure { println("Failed to start the server. Reason ${it.message}") } .await() } override suspend fun start() { val router = Router.router(vertx) createRoutes(router, createJwtAuth()) server(router) } }

Sugerencia: estoy usando Vertx 4.0.0 RC1

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El compilador porque authz.getAuthorizations(it.user()).await() no se invoca en una función suspendida: se invoca desde el controlador de rutas web de Vert.x.

Debes envolver tu invocación con launch :

 router.route("/api/greet").handler { println(RoleBasedAuthorization.create("ad-admins").match(it.user())) launch { authz.getAuthorizations(it.user()).await() } }

Dado que este código está definido en un CoroutineVerticle , el coroutine estará vinculado al contexto de la verticle (y el código invocado en el bucle de eventos de la verticle).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda