Quarkus框架下调用RoutingContext.session()返回null问题咨询
问题原因
- Quarkus默认不会自动开启Session支持,不属于开箱即用能力,缺少SessionHandler注册和对应依赖会导致
RoutingContext.session()返回null - 你当前的
RoutingContext注入方式错误:JAX-RS Resource默认是单例作用域,将请求级的RoutingContext注入到构造函数作为类成员,会导致上下文失效,无法拿到当前请求的会话信息
修复步骤
1. 引入必要依赖
Maven的pom.xml里添加:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-vertx-http</artifactId> </dependency>
2. 全局注册SessionHandler
创建自定义路由配置类,将SessionHandler注册到全局路由链,示例如下:
import io.quarkus.vertx.http.RouteCustomizer; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.SessionHandler; import io.vertx.ext.web.sstore.LocalSessionStore; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; @ApplicationScoped public class SessionConfig { @Produces public RouteCustomizer sessionHandlerCustomizer() { return router -> { // 注册会话处理器,使用本地存储,生产环境可替换为Redis等分布式存储 SessionHandler sessionHandler = SessionHandler.create(LocalSessionStore.create(router.vertx())); // 自定义会话超时时间,单位毫秒,示例为30分钟 sessionHandler.setSessionTimeout(1800000); router.route().order(-1).handler(sessionHandler); }; } }
分布式部署场景下将LocalSessionStore替换为对应分布式存储的SessionStore实现即可
3. 修正Resource代码的上下文注入方式
不要在构造函数注入RoutingContext,改为在请求方法的参数中注入:
import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import org.jboss.logging.Logger; @Path("/callback") public class CallbackResource { private static final Logger logger = Logger.getLogger(CallbackResource.class); @GET public Response callback(@Context RoutingContext routingContext) { logger.infof("session id %s", routingContext.session().id()); return Response.ok().build(); } }
内容的提问来源于stack exchange,提问作者joeng
相关产品推荐
相关产品推荐

