Quarkus中如何在类中获取当前HttpRequest?注入请求实例为空问题求助
在Quarkus中正确获取当前HttpRequest的方法
你遇到的空指针问题,首先得揪出最明显的错误:你导入的HttpRequest类不对! 你用的java.net.http.HttpRequest是Java标准库中用于发起HTTP请求的客户端类,根本不是Quarkus/Jakarta EE里代表当前请求的对象,这肯定会注入失败呀。
下面给你两种靠谱的解决方案,按需选择:
方案一:使用JAX-RS的HttpRequest(推荐用于JAX-RS场景)
首先把导入包换成Jakarta EE标准的JAX-RS请求类,然后确保注入和上下文正确:
import jakarta.ws.rs.core.HttpRequest; import jakarta.enterprise.context.RequestScoped; import jakarta.ws.rs.core.Context; @RequestScoped public class BaseErrorCode { // 用@Context注入JAX-RS的HttpRequest @Context private HttpRequest request; public void handleRequest() { if (request != null) { // 获取请求URI String requestUri = request.getUri().toString(); // 获取请求方法(GET/POST等) String method = request.getMethod(); // 这里可以做你需要的逻辑处理 } } }
注意事项:
- 这个
BaseErrorCodeBean必须在请求上下文中被调用,比如你在JAX-RS的资源类(带@Path的类)里注入它,而不能在启动时的Bean或者非请求触发的代码里直接调用,否则@RequestScoped的Bean还没初始化,request自然是空的。 - 确保你的项目已经添加了Quarkus的JAX-RS依赖(比如
quarkus-resteasy-reactive或者quarkus-resteasy),不然JAX-RS的上下文不会生效。
方案二:使用Quarkus专属的CurrentVertxRequest(更灵活)
如果你的场景不在JAX-RS上下文里,或者需要更底层的请求信息,可以用Quarkus提供的CurrentVertxRequest来获取当前请求:
import io.quarkus.vertx.http.runtime.CurrentVertxRequest; import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; @RequestScoped public class BaseErrorCode { @Inject CurrentVertxRequest currentVertxRequest; public void handleRequest() { // 用ifPresent避免空指针 currentVertxRequest.getCurrent().ifPresent(vertxRequest -> { String uri = vertxRequest.uri(); String method = vertxRequest.method().name(); // 这里可以获取更多底层请求信息,比如请求头、参数等 }); } }
这种方式的好处是,即使在非JAX-RS的场景(比如Vert.x的路由、拦截器里)也能拿到当前请求,适用性更广。
内容的提问来源于stack exchange,提问作者Sajan Soosaimicheal
相关产品推荐
相关产品推荐

